使用 Python 无法打开 Excel 文件

Failing to open an Excel file with Python

我在 Debian GNU/Linux 计算机上,使用 Python 2.7.9.

作为我工作的一部分,我一直在制作 python 脚本来读取各种格式的输入(例如 Excel、Csv、Txt)并将信息解析为更标准化的文件。 这不是我第一次打开或使用 Excel 个文件。

有一个特定的文件给我带来了问题,我无法打开它。当我尝试使用 xlrd(版本 0.9.3)时,它给了我以下信息错误:

xlrd.open_workbook('sample.xls')

XLRDError: Unsupported format, or corrupt file: BOF not workbook/worksheet: op=0x0009 vers=0x0002 strm=0x000a build=0 year=0 -> BIFF21

我试图自行调查此事,在 Whosebug 中找到了几个答案,但无论如何我都无法打开它。我发现的这个特定答案可能是问题所在(第二种解释),但它不包括解决方法:

可以将文件转换为 csv/txt 的工具也可以解决问题。

我已经尝试过:

此处提供示例文件: https://ufile.io/r4m6j

附带说明一下,我可以使用 LibreOffice Calc 和 MS Excel 打开它,因此我最终可以通过这种方式将其更改为 csv。问题是,我需要使用 python 脚本来完成这一切。

提前致谢!

我对任何 xls 或 xlsx 文件都适用:

def csv_from_excel(filename_xls, filename_csv):
    wb = xlrd.open_workbook(filename_xls, encoding_override='YOUR_ENCODING_HERE (f.e. "cp1251"')
    sh = wb.sheet_by_index(0)
    your_csv_file = open(filename_csv, 'wb')
    wr = unicodecsv.writer(your_csv_file)
    for rownum in xrange(sh.nrows):
        wr.writerow(sh.row_values(rownum))
    your_csv_file.close()

因此,在将文件转换为 csv 之前,我不会直接使用 excel 文件。 Mb 它会帮助你

如果您的目标是 windows,如果您安装了 Excel,并且您熟悉 Excel VBA,您将有一个快速的解决方案,使用comtypes 包:

http://pythonhosted.org/comtypes/

您将可以通过其 COM 接口直接访问 Excel。

此代码使用 comtypes 包打开 xls 文件并将其保存为 cvs 文件:

import comtypes.client as cl
progId = "Excel.Application.15"
xl = cl.CreateObject(progId)
wb = xl.Workbooks.Open(r"C:\Users\aUser\Desktop\thermoList.xls")
wb.SaveAs(r"C:\Users\aUser\Desktop\thermoList.csv",FileFormat=6)
xl.DisplayAlerts = False
xl.Quit()

我无法使用已损坏的 "sample.xls" 对其进行测试。 您可以尝试使用另一个文件。 您可能需要根据 Excel.

的版本调整 progId

这是一个文件格式问题。我不确定它是什么文件类型,但它不是 Excel。我只是打开并保存了名称为 sample2.xls 的文件并比较了类型:

你是如何创建这个文件的?

如果您需要将单词作为字符串列表获取:

text_file = open("sample.xls", "r")
lines = text_file.read().replace(chr(200), '').replace(chr(0), '').replace(chr(1), '').replace(chr(5), '').replace(chr(2), '').replace(chr(3), '').replace(chr(4), '').replace(chr(6), '').replace(chr(7), '').replace(chr(8), '').replace(chr(9), '').replace(chr(10), '').replace(chr(12), '').replace(chr(15), '').replace(chr(16), '').replace(chr(17), '').replace(chr(18), '').replace(chr(49), '').replace('Arial', '')
for line in lines.split(chr(128)):
    print(line)

输出:

您提供的文件已损坏,其他响应者无法测试并推荐好的解决方案。你发布的例外情况证实了这一点。 作为解决方案,您可以尝试调试一些东西,请参阅以下一些步骤:

  • 您提到您尝试过 xlrd 库。尝试通过执行以下命令检查您的 xlrd 模块是否是最新的:

    Python 2.7.9

    >>> import xlrd
    
    >>> xlrd.__VERSION
    

如有需要请更新至最新官方版本

希望对您有所帮助。

这似乎是 MS 的问题。 xls文件很奇怪,也许你应该联系xlrd支持。

但我为您提供了一个疯狂的解决方法:xls2ods。它对我有用,即使 xls2csv 没有(SiC!)。

所以,首先安装 catdoc:

$sudo apt-get install catdoc

然后将您的 xls 文件转换为 ods 并使用 pyexcel_ods 或您喜欢的任何方式打开 ods。要使用 pyexcel_ods 首先使用 pip install pyexcel_ods 安装它。

import subprocess

from pyexcel_ods import get_data

file_basename = 'sample'

returncode = subprocess.call(['xls2ods', '{}.xls'.format(file_basename)])
if returnecode > 0:
    # consider to use subprocess.Popen if you need more control on stderr
    exit(returncode)

data = get_data('{}.ods'.format(file_basename))
print(data)

我得到以下输出:

OrderedDict([(u'sample',
              [[u'labo',
                u'codfarm',
                u'farmacia',
                u'direccion',
                u'localidad',
                u'nom_medico',
                u'matricula',
                u'troquel',
                u'producto',
                u'cant_total']])])

这是我会使用的一个组合:

假设您在 Debian 上有 LibreOffice,您可以使用以下方法将所有 *.xls 文件转换为 *.csv

import os 
os.system("libreoffice --headless --convert-to csv *.xls")
#or use os.call

... 然后与 csv 一致地工作。

或者您可以在需要时使用 try/except 块仅转换损坏的文件:

import os 

try:
    xlrd.open_workbook('sample.xls')
except XLRDError:
    os.system("libreoffice --headless --convert-to csv sample.xls")
    # mycsv = open("sample.csv", "r")
    # for line in mycsv.readlines():
    #     ...
    #     ...

OBS:在 运行 脚本期间保持 LibreOffice 关闭。

或者还有其他工具可以进行转换。这是一个(我没有测试过):https://github.com/dilshod/xlsx2csv

也无法打开您的 Excel。正如yadayada所说,我认为是数据源的问题。如果你真的想弄清楚原因,我建议你问 excel 而不是 python.