一尘不染

如何将io.StringIO()与csv模块一起使用?

python

我试图将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'

根据文档,io.StringIO()返回Unicode文本的内存流。当我尝试手动输入Unicode字符串时,它可以正常工作。为什么csv即使所有写入的字符串都是Unicode字符串,它也无法与模块结合使用?在什么地方str来,它使得异常?

(我知道我可以StringIO.StringIO()代替使用,但是我想知道io.StringIO()在这种情况下怎么了)


阅读 188

收藏
2020-12-20

共1个答案

一尘不染

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

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

文档的示例部分包括UnicodeReaderUnicodeWriter包装类的示例(感谢@AlexeyKachayev的指针)。

2020-12-20