社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

siri • 6 年前 • 1536 次点击  

我试图在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
 
1536 次点击  
文章 [ 2 ]  |  最新文章 6 年前
snakecharmerb
Reply   •   1 楼
snakecharmerb    6 年前

响应是逗号分隔的数据,可以使用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    6 年前

响应本质上是一个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