我对数据类型和UTF-8编码非常困惑。引擎盖下实际发生了什么?我正在阅读Python 3中没有分隔符的杂乱的JSON数据(数据有时会有日文/中文字符)。
我在阅读数据:
url = "http://localhost:8001"
data = urllib.request.urlopen(url).read()
type(data)
此刻它返回 bytes
然后我想逐字逐句地阅读
for letter in data:
type(letter)
现在回复我这封信是整数。为什么它是一个字节,现在它是一个整数? 附:我明白我得到的整数代表字符的十进制表示。但这种来回跳跃让我感到困惑。
P.S。我也找不到for循环的官方文档。有吗?
谢谢。
答案 0 :(得分:3)
将Padraic Cunningham建议的数据解码应该可行:
data = urllib.request.urlopen(url).read().decode("utf-8")
您还要求提供for循环的官方文档。我不确定你是否引用了this,或者你在谈论data
的迭代行为。
bytes
的迭代行为符合here:
由于字节对象是整数序列(类似于元组),对于字节对象b,b [0]将是整数,而b [0:1]将是长度为1的字节对象。与文本字符串形成对比,其中索引和切片都将生成一个长度为1)的字符串
没有足够的代表将其发布为对上一个答案的评论,对不起。
答案 1 :(得分:1)
您需要将date function解码为 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。