【问题标题】:Failing to open an Excel file with Python无法使用 Python 打开 Excel 文件
【发布时间】:2018-04-01 17:33:28
【问题描述】:

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

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

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

xlrd.open_workbook('sample.xls')

XLRDError:不支持的格式,或损坏的文件:BOF 不 工作簿/工作表: op=0x0009 vers=0x0002 strm=0x000a build=0 year=0 -> BIFF21

我试图自己调查此事,在 StackOverflow 中找到了几个答案,但我还是无法打开它。我找到的这个特定答案可能是问题所在(第二个解释),但它不包括解决方法:https://stackoverflow.com/a/16518707/4345659

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

我已经尝试过:

  • xlrd
  • openpyxl
  • xlsx2csv(shell 工具)

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

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

提前致谢!

【问题讨论】:

  • 只是为了仔细检查 - 文件在 Excel 中打开时没有任何问题?
  • 据我所知,是的,我可以打开它,单元格看起来正常,没有任何异常。
  • 关于您的MIMEEOF 字节错误的问题。支持的格式不是repaired formats,哪些方法会忽略错误/错误?您的文件有额外或丢失/损坏的数据(关于 file_system)
  • @franciscosollima 那个 Excel 文件是从哪里来的?如果您以某种方式从 Windows 环境中获取它,则有可能根据 Unix 标准“翻译”行尾字符。您可以检查的一件事是重命名您的 .xlsx。文件到 .zip 文件并尝试打开它。您应该能够毫无问题地打开它并提取文件。
  • 没关系,正在努力获取样品!

标签: python python-2.7 xlrd


【解决方案1】:

这似乎是 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']])])

【讨论】:

  • 就我而言,我必须从 pip 安装 pyexcel_ods,因为从 apt 成功安装 catdoc 后,它仍然没有找到 pyexcel_ods 模块。尽管如此,它仍然有效!非常感谢!
  • 很高兴为您提供帮助。是的,我没有注意到pyexcel_ods 不是catdoc 的一部分,因为pyexcel_ods 只是解析ODS 文档的一个示例。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是一个我会使用的工具:

    假设您在 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

    【讨论】:

    • 当我运行libreoffice --headless --convert-to csv sample.xls(从 os.system 和从 shell)时,没有文件被创建。也没有错。它只是默默地结束,什么都不做......
    • 当我在 libreoffice 打开的情况下运行脚本时,我也遇到了同样的情况。你在尝试的时候确定它是关闭的吗?
    • 你是对的,它确实有效,我的错。我会投票,但我仍然会接受@Trilliput 的回答,因为在我的特定情况下应用更简单!还是谢谢!
    【解决方案4】:

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

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

      Python 2.7.9

      >>> import xlrd
      
      >>> xlrd.__VERSION
      

    如果需要,更新到最新的官方版本

    希望对您有所帮助。

    【讨论】:

      【解决方案5】:

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

      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)
      

      输出:

      【讨论】:

      • 示例只是第一行。将代码应用于整个文件时,它不会拆分单元格。
      • 更重要的是,使用你的方法我设法得到了单词,但是 Excel 中的数字......它们只是不明显。
      【解决方案6】:

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

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

      【讨论】:

      • 这是我从客户那里得到的输入,他从数据提供者那里得到......也许提供/处理该数据的那个人使用了一些奇怪的格式,我不知道...... .
      • 无论如何它都不是excel。询问数据提供者他是如何保存数据的。
      【解决方案7】:

      此代码使用 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。

      【讨论】:

      • 问题是我知道如何打开“另一个文件”...我的问题是这个文件 :( 让我烦恼的是我可以用 OpenOffice Calc 打开它!
      • “不幸的是,COMTypes 是为 Windows 设计的,而不是 Linux。”来源:stackoverflow.com/a/37163775/4345659
      【解决方案8】:

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

      http://pythonhosted.org/comtypes/

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

      【讨论】:

      • 我将如何使用这个包?您可以在答案中添加一个快速脚本来实际打开我在 python 中提供的文件吗?至少要保存为另一种格式,比如 .csv...
      • 我无法使用 Excel 2013 打开 sample.xls(说它已损坏)。修复失败。它没有理由与任何其他工具一起使用。我会看看我能不能做得更多。
      【解决方案9】:

      任何 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它会帮助你

      【讨论】:

      • 我得到了同样的错误,调用 xlrd.open_workbook 是什么给了我上面复制的错误。
      猜你喜欢
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2013-11-05
      • 1970-01-01
      相关资源
      最近更新 更多