我试图将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来,它使得异常?
io.StringIO()
csv
str
(我知道我可以StringIO.StringIO()代替使用,但是我想知道io.StringIO()在这种情况下怎么了)
StringIO.StringIO()
Python 2.7csv模块不支持Unicode输入:请参阅文档开头的注释。
看来您必须将Unicode字符串编码为字节字符串,并使用io.BytesIO而不是io.StringIO。
io.BytesIO
io.StringIO
文档的示例部分包括UnicodeReader和UnicodeWriter包装类的示例(感谢@AlexeyKachayev的指针)。
UnicodeReader
UnicodeWriter