Я попытался выполнить резервное копирование программы 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 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 вручную. Почему это происходит в сочетании с модулем csv
, даже если все строки, которые записываются, являются строками Unicode? Откуда происходит str
от причины Exception?
(я знаю, что я могу использовать StringIO.StringIO()
вместо этого, но мне интересно, что случилось с io.StringIO()
в этом сценарии)