Pet*_*mit 176 python encoding json urlopen python-3.x
使用Python 3,我从URL请求json文档.
response = urllib.request.urlopen(request)
Run Code Online (Sandbox Code Playgroud)
该response对象是一个类似文件的对象read和readline方法.通常,可以使用以文本模式打开的文件创建JSON对象.
obj = json.load(fp)
Run Code Online (Sandbox Code Playgroud)
我想做的是:
obj = json.load(response)
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为urlopen以二进制模式返回文件对象.
当然,解决方法是:
str_response = response.read().decode('utf-8')
obj = json.loads(str_response)
Run Code Online (Sandbox Code Playgroud)
但这感觉很糟糕......
有没有更好的方法可以将字节文件对象转换为字符串文件对象?或者我错过任何参数urlopen或json.load给出编码?
jbg*_*jbg 99
Python拯救的精彩标准库......
import codecs
reader = codecs.getreader("utf-8")
obj = json.load(reader(response))
Run Code Online (Sandbox Code Playgroud)
适用于py2和py3.
Hum*_*art 79
HTTP发送字节.如果有问题的资源是文本,则通常通过Content-Type HTTP标头或其他机制(RFC,HTML meta http-equiv,...)指定字符编码.
urllib 应该知道如何将字节编码为字符串,但它太天真 - 它是一个可怕的动力不足和非Pythonic库.
Dive Into Python 3提供了有关情况的概述.
你的"解决方案"很好 - 虽然感觉不对,但这是正确的做法.
Ser*_*rgO 66
我认为问题是最好的答案:)
import json
from urllib.request import urlopen
response = urlopen("site.com/api/foo/bar").read().decode('utf8')
obj = json.loads(response)
Run Code Online (Sandbox Code Playgroud)
Luk*_*ger 18
对于任何试图使用该requests库解决此问题的人:
import json
import requests
r = requests.get('http://localhost/index.json')
r.raise_for_status()
# works for Python2 and Python3
json.loads(r.content.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
Sar*_*pta 13
这个适用于我,我使用'请求'库json()检查文件中的人类请求
import requests
url = 'here goes your url'
obj = requests.get(url).json()
Run Code Online (Sandbox Code Playgroud)
我使用Python 3.4.3和3.5.2以及Django 1.11.3遇到了类似的问题.但是,当我升级到Python 3.6.1时,问题就消失了.
你可以在这里阅读更多相关信息:https: //docs.python.org/3/whatsnew/3.6.html#json
如果您没有绑定特定版本的Python,请考虑升级到3.6或更高版本.
从Python 3.6开始,您可以直接使用json.loads()它来反序列化bytes对象(编码必须是UTF-8、UTF-16或UTF-32)。因此,仅使用标准库中的模块,您可以执行以下操作:
import json
from urllib import request
response = request.urlopen(url).read()
data = json.loads(response)
Run Code Online (Sandbox Code Playgroud)