python - 将 .csv 文件从 URL 读取到 Python 3.x - _csv.Error : iterator should return strings, 不是字节(您是否以文本模式打开文件?)

标签 python url csv python-3.x

我已经为这个简单的问题苦苦挣扎了太久,所以我想我应该寻求帮助。我正在尝试将国家医学图书馆 ftp 站点的期刊文章列表读入 Python 3.3.2(在 Windows 7 上)。期刊文章位于 .csv 文件中。

我试过下面的代码:

import csv
import urllib.request

url = "ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/file_list.csv"
ftpstream = urllib.request.urlopen(url)
csvfile = csv.reader(ftpstream)
data = [row for row in csvfile]

它会导致以下错误:

Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
data = [row for row in csvfile]
File "<pyshell#4>", line 1, in <listcomp>
data = [row for row in csvfile]
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

我想我应该使用字符串而不是字节?非常感谢任何解决这个简单问题的帮助,以及对问题所在的解释。

最佳答案

问题依赖于 urllib 返回字节。作为证明,您可以尝试使用浏览器下载 csv 文件,然后将其作为普通文件打开,问题就消失了。

解决了类似的问题 here .

可以通过适当的编码将字节解码为字符串来解决。例如:

import csv
import urllib.request

url = "ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/file_list.csv"
ftpstream = urllib.request.urlopen(url)
csvfile = csv.reader(ftpstream.read().decode('utf-8'))  # with the appropriate encoding 
data = [row for row in csvfile]

最后一行也可以是:data = list(csvfile) 这样更容易阅读。

顺便说一下,由于 csv 文件非常大,它可能会变慢并占用内存。也许最好使用生成器。

编辑: 使用 Steven Rumbalski 提议的编解码器,因此无需读取整个文件进行解码。减少内存消耗并提高速度。

import csv
import urllib.request
import codecs

url = "ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/file_list.csv"
ftpstream = urllib.request.urlopen(url)
csvfile = csv.reader(codecs.iterdecode(ftpstream, 'utf-8'))
for line in csvfile:
    print(line)  # do something with line

请注意,出于同样的原因,也没有创建该列表。

关于python - 将 .csv 文件从 URL 读取到 Python 3.x - _csv.Error : iterator should return strings, 不是字节(您是否以文本模式打开文件?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44872521/

相关文章:

python - 使用 Python 自动下载 DHL CSV 转储

python - 如何使用分组计算更新 pandas 数据帧?

python - 名称错误 : name 'image_path' is not defined

Javascript 结果是 URL?

java - 匹配 CSV 文件中的年份 "2XXX"

php - 我是否采取了正确的方法来处理这些文件? (带有 PHP 的 CSV)

python - 使用 python 服务记录标准输出

.net - %E2%80%8B 出现在 url .Net Core

url - 当 URL 中提供凭据时,为什么浏览器不发送 Authentication header ?

xml - 在 Powershell 中将 xml 转换为 csv 文件