如何使用python xlrd处理日语单词

时间:2011-05-20 08:45:13

标签: python xlrd

这是我的代码:

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

但它显示:

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

所以我该怎么做,

感谢

2 个答案:

答案 0 :(得分:2)

背景:在“现代”(Excel 97-2003)XLS文件中,文本有效地存储为Unicode。在较旧的文件中,文本存储为8位字符串,“代码页”记录表示如何编码,例如整数1252对应于称为cp1252windows-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

(2)Python Unicode HOWTO

答案 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(用于打印 - 可能是一个文件没问题)无法处理编码

相关问题