首页 > 解决方案 > 为什么从 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),我会得到随机整数

标签: pythondecodeurllib

解决方案


当我运行它时,'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)]

推荐阅读