无法使用Python打开Excel文件

无法使用Python打开Excel文件,python,python-2.7,xlrd,Python,Python 2.7,Xlrd,我在Debian GNU/Linux计算机上,使用Python 2.7.9。 作为我工作的一部分,我一直在制作python脚本,读取各种格式(如Excel、Csv、Txt)的输入,并将信息解析为更标准的文件这不是我第一次打开或使用Excel文件。 有一个特定的文件给我带来了问题,我就是无法打开它。当我尝试使用xlrd(版本0.9.3)时,它给了我以下错误: xlrd.open_workbook('sample.xls') XLRDError:不支持的格式,或损坏的文件:BOF not 工作簿/

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

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

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

xlrd.open_workbook('sample.xls')
XLRDError:不支持的格式,或损坏的文件:BOF not 工作簿/工作表:op=0x0009 vers=0x0002 strm=0x000a构建=0年=0 ->BIFF21

我试图自己调查此事,在StackOverflow中找到了一些答案,但我还是无法打开它。我发现的这个特定答案可能就是问题所在(第二种解释),但它不包括解决方法:

一个可以将文件插入csv/txt的工具也可以解决这个问题

我已经试过了:

  • xlrd
  • openpyxl
  • xlsx2csv(外壳工具)
此处提供了一个示例文件:

作为旁注,我可以用libreofficecalc和msexcel打开它,这样我最终可以将它更改为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()

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

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

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()


您可以通过其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
    
如有需要,更新至最新官方版本

  • 尝试打开任何其他*.xls文件,看看它是否适用于您正在使用的Python版本和当前库

  • 查看模块文档它非常好,并且有一些不同的东西描述了如何在不同的平台上使用这个模块(Win与Linux)

  • 你总是可以向社区发财(你仍然有可能进入某种奇怪的状态或bug),链接就在这里


希望有帮助

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

但我有一个疯狂的解决方法:xls2ods。尽管xls2csv没有(原文如此!),但它对我有效

因此,首先安装catdoc:

$sudo apt-get install catdoc
然后将您的xls文件转换为ods,并使用pyexcel_ods或任何您喜欢的方式打开ods。要使用pyexcel\u ods,请首先使用
pip安装pyexcel\u 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关闭


或者,还有其他工具可以进行转换。这里有一个(我没有测试过):

也无法打开Excel。正如yadayada所说,我认为这是数据源的问题。如果你真的想找出原因,我建议你询问有关excel而不是python的问题。

只是为了再次检查-文件正在excel中打开,没有任何问题?据我所知,是的,我可以打开它,单元格看起来正常,没有任何问题。这个问题与你的
MIME
EOF
字节错误有关。支持的格式不是已修复的格式,哪些方法会忽略错误/错误?您的文件中有其他或丢失/损坏的数据(关于文件系统的数据)@franciscosolima该Excel文件来自何处?如果您是以某种方式从Windows环境中获得它,那么根据Unix标准,行尾字符可能会被“翻译”。您可以检查的一件事是重命名您的.xlsx。将文件转换为.zip文件并尝试打开它。你应该能够打开它,并提取文件没有任何问题。无需担心,获得一个样本的工作!我得到了相同的错误,调用
xlrd.open\u工作簿
是我上面复制的错误的原因。我将如何使用该包?您能为答案添加一个快速脚本来实际打开我用python提供的文件吗?至少要将其保存为另一种格式,如.csv…我无法使用Excel 2013打开sample.xls(表示它已损坏)。修理失败了。它没有理由与任何其他工具一起工作。我会看看我是否能做得更多。问题是我知道如何打开“另一个文件”。。。我的问题是这个文件:(让我烦恼的是,我可以用OpenOffice Calc打开它!”不幸的是,COMTypes是为Windows而不是Linux设计的。”来源:这是我从客户端获得的输入,它