2016-03-07 83 views
1

我解析一個CSV文件,並寫入其內容的一部分,使用xlwt在Python代表微秒2.7

每次微秒原始文件彈出一個xls文件,我從xlwt得到的UnicodeDecodeError:

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 
>>> 

編輯:print u'\xb5s'作品在Python 2,感謝@cdarke。但是打印並不能解決問題,它不是我可以送到xlwt的內部表示。 編輯結束。

那麼如何在Python 2中表示μs?

記事本++顯示csv文件很好,帶有μs。 「編碼」菜單顯示它的編碼爲「ANSI」,如果我更改爲「UTF-8」,我開始在整個文本中看到「B5」。 Python 2 Unicode沒有稱爲「ANSI」的編碼。 是否有Python 2 Unicode編碼等效於Notepad ++所稱的「ANSI」?

+2

關於python 2.7我打印u'\ xb5s'',它在OS X的終端上顯示得很好,所以它可能是終端系統使用的編碼。你在使用哪種環境?由於你在Windows上,你應該知道'cmd.exe'不支持Unicode。 – cdarke

+0

@cdarke'print u'\ xb5s''也在我的python 2中工作,謝謝你的提示。我原來的嘗試沒有使用print語句。 –

+2

「ANSI」編碼可能是「Windows-1252」。嘗試使用「cp1252」編碼,如果它不會幫助「latin_1」。 – Nikita

回答

1

ANSI在記事本中是Windows本地語言環境。如果您使用的是美國的Windows,則區域設置爲cp1252。您的文件可能編碼在cp1252而不是utf8。如果您使用的是Windows的另一個版本,locale.getpreferredencoding()會告訴您Windows認爲是什麼ANSI

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