类型错误:无法在类似字节的对象上使用字符串模式。

25
import json
import requests

url = 'http://developer.usa.gov/1usagov.json'
r = requests.get(url, stream=True)

for line in r.iter_lines():
    if line:
        print (json.loads(line))

会出现以下错误:

TypeError: can't use a string pattern on a bytes-like object

在浏览器中查看时,我看到响应是一个Json,但请求库却说它是一个字节对象,为什么?


通常情况下,当数据在网络中传输时,它们是以字节的形式传递的。 - woozyking
1个回答

37
如果您使用的是Python 3.x,您应该将str对象传递给json.loads函数。
请替换以下行:
print(json.loads(line))

随着:

print(json.loads(line.decode()))

更新:Python 3.6中行为已更改。参数现在可以是字节或字节数组类型。输入编码应为UTF-8、UTF-16或UTF-32。


@nehemiah 我宁愿在我的代码中出现异常,也不愿意有错误。 - Aran-Fey
不,json loads期望一个字符串,这意味着它会将传入的对象强制转换为字符串,这就是p2中发生的事情,而且非常符合Python风格。你为什么认为这会导致错误? - nehem
@nehemiah,Python 3.6中的行为已更改:自版本3.6起:s现在可以是字节或字节数组类型。输入编码应为UTF-8、UTF-16或UTF-32。(https://docs.python.org/3/library/json.html#json.loads) 这个问题被标记为python-3.x,因此我基于Python 3.x的行为进行了回答(在Python 3.6之前)。 - falsetru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接