这是我的代码:
#!/usr/bin/python
#-*-coding:utf-8-*-
import xlrd,sys,re
data = xlrd.open_workbook('a.xls',encoding_override="utf-8")
a = data.sheets()[0]
s=''
for i in range(a.nrows):
if 9<i<20:
#stage
print a.row_values(i)[1].decode('shift_jis')+'\n'
但它显示:
????
????????
??????
????
????
????
????????
所以我该怎么做,
感谢
答案 0 :(得分:2)
背景:在“现代”(Excel 97-2003)XLS文件中,文本有效地存储为Unicode。在较旧的文件中,文本存储为8位字符串,“代码页”记录表示如何编码,例如整数1252对应于称为cp1252
或windows-1252
的编码。在任何一种情况下,xlrd
都将提取的文本显示为unicode对象。
请将此行插入您的代码中:
print data.biff_version, data.codepage, data.encoding
如果你有一个新文件,你应该看到
80 1200 utf_16_le
无论如何,请编辑您的问题以报告结果。
问题1:仅当文件是旧文件并且您知道/怀疑代码页记录被省略或错误时,才需要encoding_override
。如果文件是新文件,则忽略它。你真的知道文件是Excel-97之前的文件,文本是用UTF-8编码的吗?如果是这样,它只能由一些严重被欺骗的第三方软件创建,如果您尝试用Excel打开它,Excel将会爆炸;用棒球棒访问作者。否则,请勿使用encoding_override。
问题2:应该拥有unicode
个对象。要显示它们,您需要使用合适的编码将编码(不解码)从unicode
发送到str
。非常令人惊讶的是print unicode_object.decode('shift-jis')
没有引发异常并打印问号。
为了帮助理解这一点,请将您的代码更改为:
text = a.rowvalues(i)[1]
print i, repr(text)
print repr(text.decode('shift-jis'))
并报告结果。
这样我们就可以帮助您选择合适的编码(如果有的话),告诉我们您正在使用的操作系统版本以及以下显示内容:
print sys.stdout.encoding
import locale
print locale.getpreferredencoding()
进一步阅读:
(1)xlrd文档(关于Unicode的部分,正好在前面)...包含在发行版中,或者获取最新的提交here。
答案 1 :(得分:0)
为什么你的编码会在open shift-jis上覆盖?
data = xlrd.open_workbook('a.xls',encoding_override="shift-jis")
如果文件确实是shift-JIS,那么 lot 代码点(坦率地说,几乎所有代码点)都不会与有效的UTF-8代码点重叠。如果你收到非法字符(?)并且你的文件真的是UTF-8并且你想输出Shift-JIS,我可能会建议你的输出shell(用于打印 - 可能是一个文件没问题)无法处理编码