Python 2 vs. Python 3 - urllib formats

8 浏览
0 Comments

Python 2 vs. Python 3 - urllib formats

我真的厌倦了试图弄清楚为什么这段代码在Python 2中可行而在Python 3中不可行。我只是想获取一个json页面然后解析它。以下是Python 2中的代码:

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()返回的数据是“bytes”类型。然而,我无论如何都无法将其转换为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的答案提供了在Python 3中使脚本工作的方法,通过将IO设置为utf8。但一个问题仍然存在:为什么这段代码在Python 2中可行,而在Python 3中不可行?

0
0 Comments

Python 2和Python 3之间的一些差异导致了问题的出现。在给出的代码中,使用了一些不适用于Python 3的语法和函数。其中一个问题是f.read()失败,因为没有定义f变量。此外,还有一些与输出和编码相关的问题。

解决方法是将代码中不适用于Python 3的部分进行修改。例如,将f.read()修改为适用于Python 3的语法。此外,还可以尝试设置正确的编码环境变量(如PYTHONIOENCODING)来解决输出和编码问题。

需要注意的是,在Windows终端中显示Unicode字符可能会受到限制。因此,如果在Windows终端中无法显示数据,可能是由于终端的输出能力限制。可以尝试更改终端的编码设置,如将代码页设置为UTF-8,并将终端字体设置为Unicode字体。

总之,Python 2和Python 3之间存在一些语法和函数的差异,需要根据不同版本进行适当的修改。同时,输出和编码问题可能受到终端的限制,可以尝试修改终端的编码设置来解决。

0
0 Comments

Python 2和Python 3之间存在许多不兼容的变化,其中之一涉及到urllib模块的格式处理。Python 2中的urllib模块使用的是Unicode编码(unicode),而Python 3中的urllib模块使用的是字符串(str)类型。这导致了在将数据与网络或磁盘交互时出现了一些问题。

Python 3的字符串类型是理想化的对象,它处理的是“字符”,而不是“字节”。为了在磁盘和网络数据中使用这些字符,需要通过一个“转换表”(也称为编码或代码页)将其编码为字节或从字节解码为字符。由于操作系统的多样性,Python在历史上避免猜测应该使用哪种编码方式。尽管这一点在多年来有所改变,但仍然遵循“面对不确定性时,拒绝猜测”的原则。

幸运的是,Web服务器使得我们的工作更加简单。我们可以通过检查响应的Content-Type标头中的charset值来获取所需的额外信息。通过使用该charset,我们可以将请求的数据解码为Unicode(在Python 3中使用bytes.decode(charset) → str)。

因此,每次向Web服务器发出请求时,我们应该检查Content-Type标头以获取charset值,并使用该charset将请求的数据解码为Unicode(Python 3中的bytes.decode(charset) → str)。

0
0 Comments

Python 2和Python 3之间的差异是许多Python开发者经常面临的问题之一。其中一个差异是在使用urllib库时的格式。

在Python 3中,我们使用`urllib.request`来代替Python 2中的`urllib`模块。这是因为Python 3对urllib进行了重构,将其分成了几个模块,以提高代码的可读性和易用性。

上面的代码片段中,我们可以看到Python 3中使用了`urllib.request.urlopen()`函数来打开URL并读取数据。然后,使用`.decode('utf8')`将数据解码为UTF-8格式。

而在Python 2中,我们使用`urllib`模块来处理URL。在代码中,我们可以看到使用`urllib.urlencode()`函数将参数编码为URL查询字符串,并将其附加到URL上。然后,使用`urllib.urlopen()`函数打开URL并获取数据。

为了解决这个问题,我们需要根据我们所使用的Python版本来选择正确的库。如果我们使用的是Python 3,我们应该使用`urllib.request`库。如果我们使用的是Python 2,我们应该使用`urllib`库。

总结起来,Python 2和Python 3之间的urllib格式差异是由于Python 3对urllib进行了重构,将其分成了几个模块。为了解决这个问题,我们需要根据我们所使用的Python版本来选择正确的库。

以下是代码片段的总结:

对于Python 3.5:

import urllib.request
data = urllib.request.urlopen(url).read().decode('utf8')

对于Python 2.7:

import urllib
url = serviceurl + urllib.urlencode({'sensor':'false', 'address': address})   
uh = urllib.urlopen(url)

我们可以根据我们的Python版本选择正确的代码片段来处理URL。

0