Я разборе CSV, и писать часть его содержимого в файл XLS с помощью xlwt
представляющие мкс в Python 2.7
Каждый раз, когда мкс выскакивает в исходном файле, я получаю UnicodeDecodeError от xlwt
:
File "C:\SW_DevSandbox\E2\FlightTestInstrumentation\ICDforFTI\ICDforFTI.py", line 243, in generateICD
icd.write(icdLine,icdTitle.index('Unit'),entry['Unit'])
File "C:\espressoE2\tools\OpenVIB\1.2\python\lib\site-packages\xlwt\Worksheet.py", line 1030, in write
self.row(r).write(c, label, style)
File "C:\espressoE2\tools\OpenVIB\1.2\python\lib\site-packages\xlwt\Row.py", line 240, in write
StrCell(self.__idx, col, style_index, self.__parent_wb.add_str(label))
File "C:\espressoE2\tools\OpenVIB\1.2\python\lib\site-packages\xlwt\Workbook.py", line 326, in add_str
return self.__sst.add_str(s)
File "C:\espressoE2\tools\OpenVIB\1.2\python\lib\site-packages\xlwt\BIFFRecords.py", line 24, in add_str
s = unicode(s, self.encoding)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb5 in position 0: invalid start byte
Я думаю, что корень проблемы заключается в следующем:
В Python 3, я могу легко представлять микросекунд:
>>> '\xb5s'
'µs'
>>>
В Python 2, по-видимому, нет:
>>> '\xb5s'
'\xb5s'
>>> u'\xb5s'
u'\xb5s'
>>> unicode('\xb5s')
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb5 in position 0: ordinal not in range(128)
>>> unicode('\xb5s','utf8')
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "C:\espressoE2\tools\OpenVIB\1.2\python\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb5 in position 0: invalid start byte
>>>
Edit: print u'\xb5s'
работает в Python 2, благодаря @cdarke. Но печать не решает проблему, это не внутреннее представление, которое я могу передать до xlwt
. конец редактирования.
Итак, как я могу представить μs в Python 2?
Notepad ++ отображает файл csv fine, с μs. Меню «Кодирование» показывает, что оно кодируется как «ANSI», и если я перехожу на «UTF-8», я начинаю видеть «B5» по всему тексту. Python 2 Unicode не имеет кодировки под названием «ANSI». Есть ли кодировка Unicode Python 2, эквивалентная тому, что Notepad ++ вызывает «ANSI»?
На python 2.7 Я распечатываю u '\ xb5s'', и он отлично отображает терминал в OS X, поэтому это может быть кодировка, используемая терминальной системой. Какую среду вы используете? Поскольку вы находитесь в Windows, вы должны знать, что 'cmd.exe' не поддерживает Unicode. – cdarke
@cdarke'print u '\ xb5s'' работает и в моем питоне 2, спасибо за эту подсказку. Моя первоначальная попытка не использовала оператор печати. –
Кодировка «ANSI», вероятно, «Windows-1252». Попробуйте использовать кодировку '' cp1252'', если это не поможет ''latin_1''. – Nikita