Py学习  »  Python

使用python解析以字节形式传入的api响应

siri • 4 年前 • 603 次点击  

我试图在python脚本中解析api响应。响应以字节的形式传入。基本内容如下。

b'studentName, Dept, Env, result,\n
"abcd","science","dev","pass"\n
"decf","math","dev","fail"\n'

第一行有标题,第二行以后的行在标题下有值。

我试过用elementtree

data = ElementTree.fromstring(response.content)
for log in data.iter('\n'):
    print(data.text)

但是得到了下面的回应

attributeerror:“bytes”对象没有“text”属性

我需要能够分析它并找到通过理科考试的学生。 有什么更好的方法可以解析它并将数据过滤到我要查找的内容?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40634
 
603 次点击  
文章 [ 2 ]  |  最新文章 4 年前
snakecharmerb
Reply   •   1 楼
snakecharmerb    5 年前

响应是逗号分隔的数据,可以使用python的 csv 模块。

>>> bs = b'studentName, Dept, Env, result,\n"abcd","science","dev","pass"\n"decf","math","dev","fail"\n'
>>> import csv
>>> import io
>>> # Put the data into a buffer
>>> sio = io.StringIO(bs.decode('utf-8'))
>>> with sio as f:
...     reader = csv.DictReader(f)
...     for row in reader:
...         print(row)
... 
OrderedDict([('studentName', 'abcd'), (' Dept', 'science'), (' Env', 'dev'), (' result', 'pass'), ('', None)])
OrderedDict([('studentName', 'decf'), (' Dept', 'math'), (' Env', 'dev'), (' result', 'fail'), ('', None)])

每个输出行都是一个字典,可以用通常的方式访问

row['result']
DYZ
Reply   •   2 楼
DYZ    5 年前

响应本质上是一个csv表。将其解码为字符串并使用csv读取器(例如,来自pandas)读取:

import io
import pandas as pd
response_df = pd.read_csv(io.StringIO(response.content.decode()))
#  studentName     Dept  Env  result  Unnamed: 4
#0        abcd  science  dev    pass         NaN
#1        decf     math  dev    fail         NaN

最后一列是每行末尾有孤立逗号的结果。你可以放下它:

df.dropna(axis=1, inplace=True)
#  studentName     Dept  Env  result
#0        abcd  science  dev    pass
#1        decf     math  dev    fail