如何使用字符串作为csv阅读器的输入而不将其存储到文件中

时间:2017-02-01 10:34:51

标签: python csv stringio

我试图遍历csv文件中的行。我从网址获取csv个文件string。我知道如何在数据存储在文件中时使用csv.reader创建with。我不知道的是,如何在不将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:

但是,当然,没有一个有效。

3 个答案:

答案 0 :(得分:4)

>>> import csv
>>> csv_data = "some,string\nfor,example"
>>> result = csv.reader(csv_data.splitlines())
>>> list(result)
[['some', 'string'], ['for', 'example']]

答案 1 :(得分:1)

如果您喜欢上下文管理器,则可以改为使用tempfile

import tempfile


with tempfile.NamedTemporaryFile(mode='w') as t:
     t.write('csv_data')
     t.seek(0)
     csv_reader = reader(open(t.name), delimiter=",", quotechar='"')

作为将字符串分割线直接传递给csv阅读器的优点,您可以编写任何大小的文件,然后在没有内存问题的情况下在csv阅读器中安全地读取它。

此文件将被关闭并自动删除

答案 2 :(得分:1)

您应该使用io模块而不是StringIO模块,因为io.BytesIO用于字节字符串,io.StringIO用于Unicode,它们都支持上下文管理器接口,可以在with语句中使用:

from io import BytesIO
from csv import reader
csv_data = "some_string\nfor_example"
with BytesIO(csv_data) as input_file:
    csv_reader = reader(input_file, delimiter=",", quotechar='"')
    for row in csv_reader:
        print row