2.7 CSV-модуль хочет unicode, но не хочет unicode

csvfile_ = open(finishedFileName+num+".csv","w",newline='')
writ = csv.writer(csvfile_, dialect='excel')
firstline = unicode(str(firstline))
try:
    writ.writerow(firstline)
except TypeError:
    print firstline
    print type(firstline)
    raise

Я получаю TypeError: must be unicode, not str с этим кодом. При печати типа первой линии я вижу <type 'unicode'>. Когда я печатаю первую строку, я вижу ['project_number', 'project_location'] (список длиннее этого, но он продолжается в этом стиле.)

Эта программа отлично работала в python 3.3. Я портировал его с помощью 3to2, переключившись с unix на windows, когда я это сделал.

Как я могу заставить эту программу писать плавно?

Примечание. Эта версия модуля csv не поддерживает ввод Unicode в соответствии с официальной документацией, но он сказал мне, чтобы он все равно вводил Unicode.

Полное исключение

Traceback (most recent call last):
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 382, in <module>
    process(marketingLogExportFileName)
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 123, in process
    writing(csvfile,modified,firstline)
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 114, in writing
    writ.writerow(firstline)
TypeError: must be unicode, not str

Если я вырву код, чтобы сделать первый unicode, я вместо этого получаю

Traceback (most recent call last):
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 382, in <module>
    process(marketingLogExportFileName)
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 123, in process
    writing(csvfile_,modified,firstline)
  File "C:\Users\urightswt\Downloads\LogModToConvert.py", line 114, in writing
    writ.writerow(firstline)
TypeError: must be unicode, not str

Ответ 1

К сожалению, 3to2 использовал вызов io.open() вместо встроенной функции Python 2 open(). Это открыло файл в текстовом режиме, который, как на Python 3, ожидает ввода Unicode.

Однако модуль csv не поддерживает данные Unicode; он, конечно же, не создает Unicode.

Вам придется либо открыть файл в двоичном режиме на Python 2:

mode = 'w'
if sys.version_info.major < 3:
    mode += 'b'
csvfile_ = open(finishedFileName + num + ".csv", mode, newline='')

или вместо этого используйте встроенный вызов open():

csvfile_ = open(finishedFileName + num + ".csv", 'wb')

где вы все равно должны использовать 'wb'.

Если вы пытаетесь записать данные в формате unicode, вам нужно будет закодировать эти данные, прежде чем передавать их объекту csv.writer(). В разделе csv примеров модулей содержится код для кодирования из Unicode, прежде чем писать немного проще.

Ответ 2

У меня была та же проблема с open() и csv. Друг дал мне решение, которое должно использовать open_output() вместо open(). open_output() по умолчанию заменяет "wb" вместо текста.