2016-03-07 2 views
1

Я разборе 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»?

+2

На python 2.7 Я распечатываю u '\ xb5s'', и он отлично отображает терминал в OS X, поэтому это может быть кодировка, используемая терминальной системой. Какую среду вы используете? Поскольку вы находитесь в Windows, вы должны знать, что 'cmd.exe' не поддерживает Unicode. – cdarke

+0

@cdarke'print u '\ xb5s'' работает и в моем питоне 2, спасибо за эту подсказку. Моя первоначальная попытка не использовала оператор печати. –

+2

Кодировка «ANSI», вероятно, «Windows-1252». Попробуйте использовать кодировку '' cp1252'', если это не поможет ''latin_1''. – Nikita

ответ

1

ANSI в Блокноте - это родной язык для Windows. Если вы используете US Windows, то locale - cp1252. Вероятно, ваш файл закодирован в cp1252, а не utf8. Если вы используете другую версию Windows, locale.getpreferredencoding() расскажет вам, что Windows считает ANSI.

>>> '\xb5s'.decode('cp1252') 
u'\xb5s'