【问题标题】:Data types and documentation for for-loop in Python 3Python 3 中 for 循环的数据类型和文档
【发布时间】:2016-10-27 02:56:36
【问题描述】:

我对数据类型和 UTF-8 编码感到非常困惑。引擎盖下到底发生了什么?我正在阅读 Python 3 中没有分隔符的凌乱 JSON 数据(数据不时有日文/中文字符)。

我正在读取数据:

url = "http://localhost:8001"
data = urllib.request.urlopen(url).read()
type(data)

它现在返回 bytes

那我要一个字一个字地读

for letter in data:
    type(letter)

它现在返回我那个字母是一个整数。为什么它是一个字节,现在它是一个整数? 附言我知道我得到的整数代表字符的十进制表示。但是这种来回跳跃让我很困惑。

附:我也找不到 for-loop 的官方文档。有吗?

谢谢。

【问题讨论】:

  • “为什么它是一个字节,而现在它是一个整数?” 这里的“它”是什么? letter?但是letter 从来都不是一个字节。 data?但data 绝不是整数。这似乎等同于问题“为什么x = [1,2,3]; print(type(x)); print(type(x[0])) 打印'list' 然后'int'?

标签: python string python-3.x utf-8


【解决方案1】:

按照 Padraic Cunningham 的建议解码数据应该可行:

data = urllib.request.urlopen(url).read().decode("utf-8")

您还要求提供 for 循环的官方文档。我不确定你是指this还是你在谈论data的迭代行为。

bytes 的迭代行为如 here 所述:

由于字节对象是整数序列(类似于元组),对于字节对象 b,b[0] 将是一个整数,而 b[0:1] 将是一个长度为 1 的字节对象。(这与文本字符串形成对比,其中索引和切片都会产生长度为 1) 的字符串

没有足够的代表将其作为对上一个答案的评论发布,对不起。

【讨论】:

  • Adirio,感谢您提供的文档。是的,我正在寻找那个。您还可以分享一下数据的迭代行为吗?我不太清楚你的意思:) 我稍后再读。
  • 编辑了我的回答以包含您要求的信息。
【解决方案2】:

您需要将bytes 解码为str

In [12]: data = urllib.request.urlopen("http://stackoverflow.com/questions/38014233/data-types-and-documentation-for-for-loop-in-python-3/38014292#38014292").read()

In [13]: type(data)
Out[13]: bytes

In [14]: type(data.decode("utf-8"))
Out[14]: str

In [15]: data[0]
Out[15]: 60

In [16]: data.decode("utf-8")[0]
Out[16]: '<'

解码后,您将在循环和打印时看到字符。 urllib.request.urlopen(url).read() 返回 bytes,你可以将字节解码成一个 str。

【讨论】:

  • 谢谢,这实际上有很大帮助。我主要关心的是,为什么 for 循环返回整数而不是字节?
  • @Cooper,这在我的答案中显示,data[0] -&gt; 60,因为在解码data.decode("utf-8")[0] -&gt; "&lt;" 之后,它还没有被解码为 str。 for 循环遍历每个字节,所以你看到的只是 int/byte 值,你不明白什么?你解码并运行你的 for 循环了吗?
  • @Cooper:因为bytes 对象会遍历每个单独字节的数值。与for 循环无关,这只是bytes 实现迭代器协议的方式。如果你做了list(data),你会得到listint
猜你喜欢
  • 1970-01-01
  • 2022-07-30
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多