0

这是我的代码:

#!/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'

但它显示:

????
????????
??????
????
????
????
????????

那我该怎么办

谢谢

4

2 回答 2

2

背景:在“现代”(Excel 97-2003)XLS 文件中,文本有效地存储为 Unicode。在较旧的文件中,文本存储为 8 位字符串,“代码页”记录告诉它是如何编码的,例如整数 1252 对应于称为cp1252or的编码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对象。要显示它们,您需要对它们进行编码而不是解码unicodestr使用合适的编码。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 的部分,就在前面)...包含在发行版中,或者在此处获取最新提交。

(2) Python Unicode HOWTO

于 2011-05-20T12:44:36.563 回答
0

为什么您的编码没有覆盖打开的 shift-jis?

data = xlrd.open_workbook('a.xls',encoding_override="shift-jis")

如果文件确实是 shift-JIS,则有很多代码点(坦率地说,几乎所有代码点)不与有效的 UTF-8 代码点重叠。如果您收到非法字符 (?) 并且您的文件确实是 UTF-8 并且您想输出 Shift-JIS,我是否建议您的输出 shell(用于打印 - 可能文件可以)无法处理编码.

于 2011-05-20T09:00:32.020 回答