[英]representing µs in Python 2.7
我正在解析 csv,并使用xlwt
将其部分内容写入 xls 文件
每次在原始文件中弹出 µs 时,我都会从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中,我可以很容易地表示µs:
>>> '\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。 但是 print 并不能解决问题,它不是我可以提供给xlwt
的内部表示。 编辑结束。
那么如何在 Python 2 中表示 µs?
Notepad ++ 可以很好地显示 csv 文件,带有 µs。 “编码”菜单显示它的编码为“ANSI”,如果我更改为“UTF-8”,我开始在文本中看到“B5”。 Python 2 Unicode 没有称为“ANSI”的编码。 是否有与 Notepad++ 称为“ANSI”的内容等效的 Python 2 Unicode 编码?
Notepad 中的ANSI
是 Windows 的本地语言环境。 如果您使用的是美国 Windows,则区域设置为cp1252
。 您的文件可能是用cp1252
而不是utf8
编码的。 如果您使用的是其他版本的 Windows, locale.getpreferredencoding()
会告诉您 Windows 认为ANSI
是什么。
>>> '\xb5s'.decode('cp1252')
u'\xb5s'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.