使用xlrd读取包含中文和/或印地语字符的Excel xls文件

6 投票
4 回答
17546 浏览
提问于 2025-04-16 02:57

在上面的链接中,我使用了这个工具来读取一个XLS文件。如果这个XLS文件里面有中文或印地语等不同语言的字符,它就不能正确输出这些字符。有没有什么解决办法呢?

我在网上搜索后,找到了这个:

import xlrd

def upload_xls(dir,file,request):
    try:
        global msg
        global row_num
        row_num = []
        header_arr = []
        global file_path
        file_path = dir
        #reader = csv.reader(open(file), delimiter='#', quotechar='"')
        book = xlrd.open_workbook('dodgy.xls',encoding='cp1252')   ##To specify UTF8-encoding
        wb.sheet_names()
        sh =  wb.sheet_by_index(0)
        valid_xl_format = 0
        invalid_xl_format = 0
     except:
        print "Error

但是在这一行 book = open_workbook('dodgy.xls',encoding='cp1252') 出现了一个错误:

TypeError: open_workbook() got an unexpected keyword argument 'encoding'

4 个回答

1

在Python的标准库里,有一个叫做csv的模块,它可以处理Unicode字符,这在Python 3.1版本中是可以的。

注意:在Python 2.x版本中,csv库是不支持Unicode的。

10

[dis]claimer: 我是xlrd的作者。

如果xls文件里包含不同语言的字符,比如中文或印地语,它输出的内容可能不准确。有没有什么解决办法呢?

文档中提到的encoding_override参数只适用于旧文件,也就是1997年之前的Excel版本生成的文件。只有在内部记录的“代码页”缺失或不正确时才会用到这个参数。

注意:如果旧文件里有中文字符,使用'cp1252'会导致错误。

注意:如果旧文件里有印地语(德瓦那加里文)字符,这种情况很少见……据我所知,ISCII脚本从来没有官方支持的代码页,我也没听说过有什么非官方的。如果你有这方面的信息或者样本文件,欢迎分享。

Excel 97及以后的版本会把所有文本数据记录为(实际上是)UTF-16LE。如果文件是有效的Excel 97或更高版本的文件,encoding_override参数会被忽略。

无论是哪个版本的Excel生成了这个文件,xlrd都会返回unicode字符串。你遇到的问题更可能是因为你在显示或转换这些unicode字符串时出了问题。

如果需要进一步的帮助,请编辑你的问题,展示实际输出的例子以及“确切的内容”。

6

根据xlrd模块的说明,正确的参数应该是:encoding_override="cp1252",而不是encoding="cp1252"

从你导入xlrd模块的方式来看,你应该使用xlrd.open_workbook来调用这个函数,但在示例代码中你直接使用了这个函数,就好像你用了from xlrd import *一样。

撰写回答