python - 为什么从 data = response.read() 读取“行”会给出一个整数?
问题描述
我有一些 Python 函数,它将一个 url 带到一个文本文件并下载它('url' 将始终是一个文本文件)。我希望能够逐行解码该文本文件,并将每一行作为字符串添加到字符串列表中。
def download_index(self, url):
response = urllib.request.urlopen(url)
data = response.read()
listOfStrings = []
for line in data:
print(line)
listOfStrings.append(line)
当我运行它时,'line' 是一个整数。相反,如果我打印“数据”,它会打印整个文本文件,未解码。
如果我解码“数据”,我无法逐行处理它,因为我已经删除了告诉它换行符在哪里的代码。编辑:我一定误解了解码的工作原理。我有这种印象是因为当我尝试解码“数据”然后逐行处理时,每个“行”都是一个大解码字符串中的一个字符
似乎这样做的唯一方法是逐行遍历“数据”,解码每一行,然后将它们添加到列表中。但我不能这样做,因为就像我说的那样,如果我尝试编写for line in data
编译器告诉我的东西,那line
就是整数。事实上,如果我尝试添加print(line)
,我会得到随机整数
解决方案
当我运行它时,'line' 是一个整数。
当您遍历类似文件的对象时,您会得到行。
当你迭代一个bytes
对象时,你会得到单独的字节值。这是整数(范围从 0-255 包括在内)。
(您用于循环变量的名称与行为无关。)
编辑:我一定误解了解码的工作原理。我有这种印象是因为当我尝试解码“数据”然后逐行处理时,每个“行”都是一个大解码字符串中的一个字符
一样。当您遍历 astr
时,您会获得单独的 Unicode 代码点(在正常情况下,这些代码点在您看来是“字符”)。
似乎这样做的唯一方法是逐行遍历“数据”,解码每一行,然后将它们添加到列表中。
事实上,你可以这样做,这是一种合理的方法。诀窍是不要 .read()
提前全部response
,而是直接response
迭代:
response = urllib.request.urlopen(url)
listOfStrings = []
for line in response:
# Of course, you need to know and use the actual encoding;
# this is a guess on my part.
listOfStrings.append(line.decode('utf-8'))
您还可以在此处使用列表推导:
listOfStrings = [line.decode('utf-8') for line in urllib.request.urlopen(url)]
推荐阅读
- intellij-idea - IntelliJ:如何配置已经在版本控制下的字典?
- react-native - React Native:如何从子组件更改父组件的状态并重新渲染父组件?
- angular - 如何在角度 4 中验证日期
- java - 使用正确的数据值自动创建新的 Java 对象
- time - Fiware Cosmos OAuth2 Token 时间增加
- highcharts - Highchart:Flags 在设置极端时出现缺货图表
- excel - 在较长期间内找到较短的天数进行计算
- android - 为什么在 Constraintlayout 中为视图提供偏差约束会影响调整动画大小?
- android - 如何在蓝牙 POS 打印机中打印右对齐的文本?
- swagger - $ref 响应示例