使用 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 的工具也可以解决问题。
我已经尝试过:
- xlrd
- openpyxl
- xlsx2csv(shell 工具)
此处提供示例文件:
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
如有需要请更新至最新官方版本
尝试打开任何其他 *.xls 文件,看看它是否适用于您正在使用的 Python 版本和当前库。
查看模块文档非常好,并且有一些不同的东西描述了如何在各种平台上使用这个模块(Win vs. Linux)http://xlrd.readthedocs.io/en/latest/dates.html
你总是可以通过社区致富(你仍然有可能进入一些奇怪的状态或错误)link 在这里 https://github.com/python-excel/xlrd/issues
希望对您有所帮助。
这似乎是 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.
我在 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 的工具也可以解决问题。
我已经尝试过:
- xlrd
- openpyxl
- xlsx2csv(shell 工具)
此处提供示例文件: 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
如有需要请更新至最新官方版本
尝试打开任何其他 *.xls 文件,看看它是否适用于您正在使用的 Python 版本和当前库。
查看模块文档非常好,并且有一些不同的东西描述了如何在各种平台上使用这个模块(Win vs. Linux)http://xlrd.readthedocs.io/en/latest/dates.html
你总是可以通过社区致富(你仍然有可能进入一些奇怪的状态或错误)link 在这里 https://github.com/python-excel/xlrd/issues
希望对您有所帮助。
这似乎是 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.