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" вместо текста.