我已经厌倦了试图找出为什么这段代码在Python 2而不是Python 3中工作。我只是想获取一个json页面,然后解析它。下面是Python2中的代码:
import urllib, json
response = urllib.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content)
我认为Python 3中的等价代码是:
import urllib.request, json
response = urllib.request.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content)
但它在我面前爆炸了,因为read()返回的数据是“字节”类型。然而,在我的一生中,我不能让它转换成json能够解析的东西。我知道reddit试图将utf-8发送回我,但我似乎无法将字节解码为utf-8:
import urllib.request, json
response = urllib.request.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content.decode("utf8"))
我做错什么了?
编辑:问题是我无法使数据进入可用状态;即使json加载了数据,其中一部分是不可显示的,我希望能够将数据打印到屏幕上。
第二次编辑:这个问题似乎更多地与打印有关,而不是与解析有关。Alex的答案通过将IO设置为utf8,为脚本在Python 3中工作提供了一种方法。但仍然存在一个问题:为什么代码在Python 2中工作,而不是在Python 3中工作?
请参阅另一个Unicode相关问题中的that答案。
现在:Python 3
str
(这是Python 2unicode
)类型是一个理想化的对象,它处理的是“字符”,而不是“字节”。这些字符,为了用于/来自磁盘/网络数据,需要通过“转换表”(即编码a.k.a代码页)对字节进行编码/解码。由于操作系统的多样性,Python在历史上避免猜测该编码是什么;多年来这种情况一直在改变,但仍然适用“面对模糊,拒绝猜测的诱惑”的原则。谢天谢地,web服务器使您的工作更轻松。上面的
response
应该会给您提供所需的所有额外信息:因此,每次向web服务器发出请求时,都要检查内容类型头中的字符集值,并使用该字符集将请求的数据解码为Unicode(Python3:
bytes.decode(charset)
→str
)。您发布的代码可能是由于错误的剪切和粘贴操作造成的,因为这两个版本中都明显是错误的(
f.read()
失败,因为没有定义f
barename)。在Py3中,
ur = response.decode('utf8')
对我来说非常好,下面的json.loads(ur)
也是。可能是错误的复制和粘贴影响了您的2到3转换尝试。取决于python版本,您必须选择正确的库。
对于python 3.5
对于Python2.7
相关问题 更多 >
编程相关推荐