如何使用字符串作为 csv reader 的输入而不将其存储到文件中
How to use string as input for csv reader without storing it to file
我正在尝试遍历 csv
文件中的行。我从 Web 位置获取 csv
文件作为 string
。当数据存储在文件中时,我知道如何使用 with
创建 csv.reader
。我不知道的是,如何在不将 string
存储到文件的情况下使用 csv.reader
获取行。我正在使用 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
class 没有 __exit__
方法,当 when
完成对该对象的所有操作时调用该方法。
我的回答是如何正确地做到这一点?我想我可以通过 subclass 并添加 __exit__
方法来改变 StringIO
class,但我怀疑有更简单的解决方案。
更新:
此外,我尝试了想到的不同组合:
with open(StringIO(csv_data)) as input_file:
with csv_data as input_file:
但是,当然,none 成功了。
>>> import csv
>>> csv_data = "some,string\nfor,example"
>>> result = csv.reader(csv_data.splitlines())
>>> list(result)
[['some', 'string'], ['for', 'example']]
如果您喜欢上下文管理器,可以使用 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 的一个优势reader,您可以写入任何大小的文件,然后在 csv reader 中安全地读取它,而不会出现内存问题。
该文件将自动关闭并删除
你应该使用 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
我正在尝试遍历 csv
文件中的行。我从 Web 位置获取 csv
文件作为 string
。当数据存储在文件中时,我知道如何使用 with
创建 csv.reader
。我不知道的是,如何在不将 string
存储到文件的情况下使用 csv.reader
获取行。我正在使用 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
class 没有 __exit__
方法,当 when
完成对该对象的所有操作时调用该方法。
我的回答是如何正确地做到这一点?我想我可以通过 subclass 并添加 __exit__
方法来改变 StringIO
class,但我怀疑有更简单的解决方案。
更新:
此外,我尝试了想到的不同组合:
with open(StringIO(csv_data)) as input_file:
with csv_data as input_file:
但是,当然,none 成功了。
>>> import csv
>>> csv_data = "some,string\nfor,example"
>>> result = csv.reader(csv_data.splitlines())
>>> list(result)
[['some', 'string'], ['for', 'example']]
如果您喜欢上下文管理器,可以使用 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 的一个优势reader,您可以写入任何大小的文件,然后在 csv reader 中安全地读取它,而不会出现内存问题。
该文件将自动关闭并删除
你应该使用 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