Как я могу использовать io.StringIO () с модулем csv?

Я попытался перенести программу 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() по этому сценарию)

 n611x00713 мая 2015 г., 12:54
Я подозреваюfrom __future__ import unicode_literals может вызвать это в python2 при создании подклассов из модулей stdlib, которые используют «литералы байтовых строк»

Ответы на вопрос(4)

когда попытался подать файл CSV напрямую через Flask, не создавая файл 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()
Смотрите такжеПодробнее о CSVЧасть колбыНесколько заметок о Strings / Unicode

csv документация:

Модуль csv напрямую не поддерживает чтение и запись Unicode, но он 8-разрядный, за исключением некоторых проблем с символами ASCII NUL. Таким образом, вы можете написать функции или классы, которые обрабатывают кодирование и декодирование для вас, если вы избегаете кодировок, таких как UTF-16, которые используют NUL. UTF-8 рекомендуется.

Вы можете найти примерUnicodeReader, UnicodeWriter Вотhttp://docs.python.org/2/library/csv.html

Решение Вопроса

csv модуль не поддерживает ввод Unicode: см.примечание в начале документации.

Кажется, вам придется кодировать строки Unicode в байтовые строки и использоватьio.BytesIO, вместоio.StringIO.

Примеры раздел документации содержит примеры дляUnicodeReader а такжеUnicodeWriter классы-обертки (спасибо @AlexeyKachayev за указатель).

 wkschwartz05 авг. 2014 г., 17:58
У меня была точно такая же проблема, как и у OP (хотя странно только в моих юнит-тестах, а не в командной строке). Во всяком случае, используяio.StringIO в Python 3 иio.BytesIO в Python 2, как предлагается в этом ответе, решена моя проблема.

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.

 andilabs20 янв. 2017 г., 16:08
AttributeError: тип объекта «_io.StringIO» не имеет атрибута «StringIO»

Ваш ответ на вопрос