【发布时间】:2017-06-18 01:35:55
【问题描述】:
我正在尝试遍历 csv 文件中的行。我从 Web 位置获得 csv 文件为 string。当数据存储在文件中时,我知道如何使用with 创建csv.reader。我不知道的是,如何使用csv.reader 获取行而不将string 存储到文件中。我正在使用 Python 2.7.12。
我尝试过像这样创建StringIO 对象:
from StringIO import StringIO
csv_data = "some_string\nfor_example"
with StringIO(csv_data) as input_file:
csv_reader = reader(csv_data, delimiter=",", quotechar='"')
但是,我收到了这个错误:
Traceback (most recent call last):
File "scraper.py", line 228, in <module>
with StringIO(csv_data) as input_file:
AttributeError: StringIO instance has no attribute '__exit__'
我知道StringIO 类没有__exit__ 方法,当when 完成对这个对象所做的任何事情时会调用该方法。
我的答案是如何正确地做到这一点?我想我可以通过继承 StringIO 类并添加 __exit__ 方法来改变它,但我怀疑有更简单的解决方案。
更新:
另外,我尝试了不同的组合:
with open(StringIO(csv_data)) as input_file:
with csv_data as input_file:
但是,当然,这些都不起作用。
【问题讨论】:
-
只需使用
input_file = StringIO(csv_data)代替with块。如何从网上下载 CSV 数据?下载时通常会得到一个文件对象,可以直接使用,而无需先将整个内容存储在一个字符串变量中,然后将该变量包装在StringIO中。 -
无法在 Python 3.5 中重现。
StringIO可用于with。 究竟您的版本和代码是什么? (from StringIO import StringIO不好...) -
@SvenMarnach 是的,我可以这样做,但我想使用
with。我使用requests.get获取数据,然后从response.text创建csv_data。 -
@SvenMarnach:StringIO 支持上下文管理器接口,可以在
with语句中使用... -
@SergeBallesta 对不起,忘了提。我使用 Python 2.7.12。我已经更新了这个问题。我使用完全
from StringIO import StringIO.