当前位置: 首页 > 面试题库 >

将URL中的.csv文件读入Python 3.x-_csv.Error:迭代器应返回字符串,而不是字节(您是否以文本模式打开文件?)

程和蔼
2023-03-14
问题内容

我已经为这个简单的问题苦苦挣扎了太久了,所以我想寻求帮助。我正在尝试从国立医学图书馆ftp站点的Python 3.3.2(在Windows7上)阅读期刊文章列表。日记文章位于.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文件,然后将其作为常规文件打开,问题就消失了。

这里也解决了类似的问题。

可以解决使用适当的编码将字节解码为字符串的情况。例如:

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

请注意,出于相同的原因,也不会创建该列表。



 类似资料:
  • 我试图运行Spring启动应用程序,这将返回我静态文件夹上的超文本标记语言静态文件,问题是:每次我加载页面:127.0.0.1我得到字符串"bakara",而不是超文本标记语言文件bakara.html.,当我加载127.0.0.1/bakara.html我得到bakara.html文件 pom.xml: 应用属性: HomeController.java: 项目结构:

  • 问题内容: 我编写了两个简单的函数来确定字符串是否是回文。我以为它们是等效的,但是2不起作用。为什么是这样? 1个 2 问题答案: 不会创建字符串,而是创建“反向”对象: 因此,字符串不等于object 。为了使它起作用,您需要确保实际评估了该对象: 所述插入件在每个字符串中的字符,并且这导致反转串之间正在变成一个字符串对象。

  • 问题内容: 我将日志保存到sdcard上的.txt文件中,但是一旦保存了两行,它就会覆盖它并重新开始? 这是我的代码: 在恢复中挂载/ data后,/ sdcard和/ data / media / 0中的日志文件会显示完整的日志历史记录,但在设备开机时不会显示完整的日志历史记录 问题答案: 这是完成的方式。以下示例代码在单击提交按钮后将详细信息保存到文件中: 希望这可以帮助 :)

  • 问题内容: 我认为能够将文本文件读入和写出字符串数组的能力是相当普遍的要求。从一种语言开始消除最初访问数据库的需求时,它也非常有用。Golang中是否存在? 例如 和 我宁愿使用现有的而不是重复的。 问题答案: 从Go1.1版本开始,有一个bufio.Scanner API可以轻松读取文件中的行。考虑上面的以下示例,该示例使用Scanner重写:

  • 问题内容: 我正在从文件中读取行,然后使用它们。每行仅由浮点数组成。 我整理了几乎所有内容,将这些行转换为数组。 我基本上是这样做的(pseudopython代码) 这行得通,但是似乎有点违反直觉和反pythonic,我想知道是否有更好的方法来处理来自文件的输入,以使最后有一个充满浮点数的数组。 问题答案: 快速回答: 如果您经常处理此类数据,csv模块将有所帮助。 如果您感到疯狂,甚至可以使用完

  • 问题内容: 我正在使用Python打开文本文档: 我想将字符串变量的值替换为文本文档。有人可以让我知道怎么做吗? 问题答案: 如果使用上下文管理器,则将自动为你关闭文件 如果你使用的是Python2.6或更高版本,则最好使用 对于python2.7及更高版本,你可以使用代替 在Python3中,该函数有一个可选参数 Python3.6引入了f字符串作为另一种选择