如何在csv模块中使用io.StringIO()?

Tim*_*ker 48 python csv unicode python-2.7

我试图将Python 3程序反向移植到2.7,我遇到了一个奇怪的问题:

>>> import io
>>> import csv
>>> output = io.StringIO()
>>> output.write("Hello!")            # Fail: io.StringIO expects Unicode
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unicode argument expected, got 'str'
>>> output.write(u"Hello!")           # This works as expected.
6L
>>> writer = csv.writer(output)       # Now let's try this with the csv module:
>>> csvdata = [u"Hello", u"Goodbye"]  # Look ma, all Unicode! (?)
>>> writer.writerow(csvdata)          # Sadly, no.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unicode argument expected, got 'str'
Run Code Online (Sandbox Code Playgroud)

根据文档,io.StringIO()返回Unicode文本的内存中流.当我尝试手动输入Unicode字符串时,它可以正常工作.为什么它与csv模块一起失败,即使写入的所有字符串都是Unicode字符串?来自哪里会str导致异常?

(我知道我可以使用StringIO.StringIO(),但我想知道io.StringIO()在这种情况下有什么问题)

Ped*_*ano 52

Python 2.7 csv模块不支持Unicode输入:请参阅文档开头注释.

您似乎必须将Unicode字符串编码为字节字符串,并使用io.BytesIO而不是io.StringIO.

文档的示例部分包含a UnicodeReaderUnicodeWriter包装类的示例(感谢@AlexeyKachayev指针).

  • 我和OP有完全相同的问题(尽管只在我的单元测试中,而不是在提示符上,奇怪).无论如何,使用Python 3中的`io.StringIO`和Python 2中的`io.BytesIO`,如本答案所示,解决了我的问题. (2认同)

小智 23

请使用StringIO.StringIO().

http://docs.python.org/library/io.html#io.StringIO

http://docs.python.org/library/stringio.html

io.StringIO是一个班级.它处理Unicode.它反映了首选的Python 3库结构.

StringIO.StringIO是一个班级.它处理字符串.它反映了传统的Python 2库结构.

  • AttributeError:类型对象'_io.StringIO'没有属性'StringIO' (2认同)

Mar*_*oma 7

当我尝试通过Flask直接提供CSV文件而不在文件系统上创建CSV文件时,我发现了这一点.这有效:

import io
import csv

data = [[u'cell one', u'cell two'], [u'cell three', u'cell four']]

output = io.BytesIO()
writer = csv.writer(output, delimiter=',')
writer.writerows(data)
your_csv_string = output.getvalue()
Run Code Online (Sandbox Code Playgroud)

也可以看看