如何在Python xlrd中处理日语词汇

0 投票
2 回答
2160 浏览
提问于 2025-04-16 18:01

这是我的代码:

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

为什么你的编码设置没有用上 shift-jis 呢?

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

如果这个文件确实是 shift-JIS 编码的话,有很多字符(其实几乎所有的字符)和有效的 UTF-8 字符是没有重叠的。如果你看到一些非法字符(?),而你的文件实际上是 UTF-8 编码,并且你想输出成 Shift-JIS 编码的话,我建议你检查一下你的输出环境(比如打印的地方——可能是文件也可以)是否能处理这种编码。

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打开它会导致崩溃;建议你去找那个软件的作者好好聊聊。否则,不要使用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的部分,在前面)...包含在发行版中,或者在这里获取最新的提交。

(2) Python Unicode HOWTO

撰写回答