python xlrd 不支持的格式,或者文件损坏。
- 2025-03-20 08:47:00
- admin 原创
- 50
问题描述:
我的代码:
import xlrd
wb = xlrd.open_workbook("Z:\\Data\\Locates\\3.8 locates.xls")
sh = wb.sheet_by_index(0)
print sh.cell(0,0).value
错误:
Traceback (most recent call last):
File "Z:Wilson radedStockStatus.py", line 18, in <module>
wb = xlrd.open_workbook("Z:\\Data\\Locates\\3.8 locates.xls")
File "C:Python27libsite-packagesxlrd__init__.py", line 429, in open_workbook
biff_version = bk.getbof(XL_WORKBOOK_GLOBALS)
File "C:Python27libsite-packagesxlrd__init__.py", line 1545, in getbof
bof_error('Expected BOF record; found %r' % self.mem[savpos:savpos+8])
File "C:Python27libsite-packagesxlrd__init__.py", line 1539, in bof_error
raise XLRDError('Unsupported format, or corrupt file: ' + msg)
xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record;
found '<table r'"
该文件似乎没有损坏或格式不同。任何有助于找到问题根源的信息都很好。
解决方案 1:
尝试用 pandas 将其作为 HTML 打开:
import pandas as pd
data = pd.read_html('filename.xls')
或者尝试任何其他 html python 解析器。
这不是一个真正的 excel 文件,而是一个可以用 excel 读取的 html 文件。
解决方案 2:
你说:
该文件似乎没有损坏或格式不同。
但是正如错误消息所示,文件的前 8 个字节是'<table r'
...这绝对不是 Excel.xls
格式。使用不会注意到(不正确的).xls
扩展名的文本编辑器(例如记事本)打开它,然后亲自查看。
解决方案 3:
某些文件在 Excel 中打开时也会发生这种情况。
解决方案 4:
我遇到了类似的问题,它与版本有关。在 python 终端检查:
>> import xlrd
>> xlrd.__VERSION__
如果您使用的是“0.9.0”,则可以打开几乎所有文件。如果您使用的是“0.6.0”(这是我在 Ubuntu 上发现的),则在处理最新的 Excel 文件时可能会遇到问题。您可以使用 Distutils 标准下载最新版本的 xlrd。
解决方案 5:
我在下载 .xls 文件并使用 xlrd 库打开它时发现了类似的问题。然后我尝试了将 .xls 转换为 .xlsx 的解决方案,详情如下:如何将 xls 转换为 xlsx
它非常有效,我现在使用 openpyxl 库来处理 .xlsx 文件,而不是打开 .xls。
希望它有助于解决您的问题。
解决方案 6:
我遇到过同样的xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record;
错误,并通过编写 XML 到 XLSX 转换器解决了该问题。原因是 xlrd 实际上不支持 XML 电子表格 (*.xml),即不支持 XLS 或 XLSX 格式。
import pandas as pd
from bs4 import BeautifulSoup
def convert_to_xlsx():
with open('sample.xls') as xml_file:
soup = BeautifulSoup(xml_file.read(), 'xml')
writer = pd.ExcelWriter('sample.xlsx')
for sheet in soup.findAll('Worksheet'):
sheet_as_list = []
for row in sheet.findAll('Row'):
sheet_as_list.append([cell.Data.text if cell.Data else '' for cell in row.findAll('Cell')])
pd.DataFrame(sheet_as_list).to_excel(writer, sheet_name=sheet.attrs['ss:Name'], index=False, header=False)
writer.save()
解决方案 7:
这可能是旧的 excel 文件格式。可以通过以下方式在 pandas 中将其读取为 html
import pandas as pd
df = pd.read_html('file.xls')
最终,这将给出一个数据框列表(如果您检查类型是否为列表)。https ://pandas.pydata.org/pandas-docs/version/0.17.1/io.html#io-read-html
您需要提取它们,例如使用df[0]
解决方案 8:
就我而言,按照@john-machin的建议,用文本编辑器打开文件后,我意识到该文件并未像Excel文件那样加密,而是采用CSV格式并保存为Excel文件。我所做的就是重命名文件及其扩展名,然后改用read_csv
函数:
os.rename('sample_file.xls', 'sample_file.csv')
csv = pd.read_csv("sample_file.csv", error_bad_lines=False)
解决方案 9:
试试这个,它对我有用。
import pandas as pd
data = pd.read_csv('filename.xls')
解决方案 10:
我也遇到了这个问题。我用 excel 打开了这个文件,然后将其保存为其他格式,例如 excel 97-2003,最后我解决了这个问题
解决方案 11:
我遇到了同样的问题。这些旧文件的格式类似于制表符分隔文件。我能够使用read_table
; 即打开我的问题文件df = pd.read_table('trouble_maker.xls')
。
解决方案 12:
当我尝试从文件夹中读取一些 XLSX 文件并且其中一个文件已打开时,出现此错误。我关闭了 XLSX 文件,此错误不再出现。
解决方案 13:
我刚刚下载了 xlrd,创建了一个 excel 文档(excel 2007)进行测试,并得到了同样的错误(消息显示“找到 PK ”)。扩展名是 xlsx。尝试将其保存为较旧的 .xls 格式,错误消失......
解决方案 14:
我遇到了同样的问题。
它位于 .xls 文件本身中 - 它看起来像一个 Excel 文件,但实际上不是。(查看当您从 Excel 打开 .xls 时是否会弹出窗口)
sjmachin 于 2013 年 1 月 19 日从https://github.com/python-excel/xlrd/issues/26发表评论有帮助。
解决方案 15:
处理了同样的问题,最终解决了这个问题,所以只说了我所做的事情。
观察 - 1 - 该文件实际上不是 XLS,我将其重命名为 txt 并注意到文件中有 HTML 文本。
2-将文件重命名为 html 并尝试读取 pd.read_html,失败。
3-由于 txt 文件中不存在该内容,因此进行了添加,删除了样式以确保表格在本地浏览器中显示,然后就可以正常工作了。
下面的代码可能会对某些人有所帮助。
import pandas as pd
import os
import shutil
import html5lib
import requests
from bs4 import BeautifulSoup
import re
import time
shutil.copy('your.xls','file.html')
shutil.copy('file.html','file.txt')
time.sleep(2)
txt = open('file.txt','r').read()
# Modify the text to ensure the data display in html page, delete style
txt = str(txt).replace('<style> .text { mso-number-format:@; } </script>','')
# Add head and body if it is not there in HTML text
txt_with_head = '<html><head></head><body>'+txt+'</body></html>'
# Save the file as HTML
html_file = open('output.html','w')
html_file.write(txt_with_head)
# Use beautiful soup to read
url = r"C:Usershitesh kumarPycharmProjectsOEM MLoutput.html"
page = open(url)
soup = BeautifulSoup(page.read(), features="lxml")
my_table = soup.find("table",attrs={'border': '1'})
frame = pd.read_html(str(my_table))[0]
print(frame.head())
frame.to_excel('testoutput.xlsx',sheet_name='sheet1', index=False)
解决方案 16:
在 google 表格中打开,然后从表格中下载为 CSV,然后重新上传到驱动器。然后,您可以从 python 打开 CSV 文件。
解决方案 17:
我知道的两种方法是再次下载 xls 文件,如果你在 google colab 中执行此操作,只需再次从计算机加载该文件并再次运行 pd.read_excel("filename,xlsx") 。它应该可以工作。
解决方案 18:
正如他们已经写的那样,它实际上是 html,要查看第一个表格,你可以使用
df= pd.read_html(file)
df[0]
要查看有多少张表,您可以使用
print('Tables found:', len(df))
解决方案 19:
这对我有用,使用encoding="utf-8"
来自这篇文章的
UnicodeDecodeError: 'charmap' 编解码器无法解码位置 100 中的字节 0x90: 字符映射到 <undefined>
def convert_to_xlsx():
with open('sample.xls', encoding="utf-8") as xml_file:
soup = BeautifulSoup(xml_file.read(), 'xml')
writer = pd.ExcelWriter('sample.xlsx')
for sheet in soup.findAll('Worksheet'):
sheet_as_list = []
for row in sheet.findAll('Row'):
sheet_as_list.append([cell.Data.text if cell.Data else '' for cell in row.findAll('Cell')])
pd.DataFrame(sheet_as_list).to_excel(writer, sheet_name=sheet.attrs['ss:Name'], index=False,
header=False)
writer.save()
解决方案 20:
melike 的答案对我有用,而最后的输出句子没有用,所以如果有人遇到与我相同的问题并想要将 xlsx 文件输出到本地位置,只需轻松修改最后三行。
import pandas as pd
from bs4 import BeautifulSoup
def convert_to_xlsx():
with open('sample.xls') as xml_file:
soup = BeautifulSoup(xml_file.read(), 'xml')
writer = pd.ExcelWriter('sample.xlsx')
for sheet in soup.findAll('Worksheet'):
sheet_as_list = []
for row in sheet.findAll('Row'):
sheet_as_list.append([cell.Data.text if cell.Data else '' for cell in row.findAll('Cell')])
output_df = pd.DateFrame(sheet_as_list)
output_df.to_excel(writer, sheet_name='sheet1',index=False, header=False)
writer.close()
解决方案 21:
import os
import pandas as pd
# Rename the file if it's not already a .csv file
if not os.path.exists('3.8 locates.csv'):
os.rename('3.8 locates.xls', '3.8 locates.csv')
# Load the data into a pandas dataframe
df = pd.read_csv("3.8 locates.csv", sep=' |
', engine='python')
# Show the first 5 rows of the dataframe
print(df.head())
代码导入 os 和 pandas 模块,然后使用它们执行以下操作:
检查文件“3.8locates.csv”是否存在。
如果不存在,它会将文件“3.8locates.xls”重命名为“3.8locates.csv”。
使用 pd.read_csv 方法将文件“3.8locates.csv”的内容加载到 Pandas 数据框中。sep 参数设置为“\t|\n”,engine 参数设置为“python”,以正确处理文件的分隔符。
使用 df.head() 方法打印数据框的前 5 行。注意:如果文件不是有效的制表符分隔或换行符分隔文件,代码可能无法按预期工作。
解决方案 22:
您的文件没有任何问题。xlrd 尚不支持 xlsx(excel 2007+)文件,尽管据称它已经支持此功能一段时间了。
Simplistix github
2 天前,他们向 git 提交了一个预 alpha 版本,该版本集成了 xlsx 支持。其他论坛建议您对 xlsx 文件使用 DOM 解析器,因为 xlsx 文件类型只是包含 XML 的 zip 存档。我还没有尝试过。还有另一个具有与 xlrd 类似功能的软件包,名为 openpyxl,您可以从 easy_install 或 pip 获取。我也没有尝试过,但是,它的 API 应该类似于 xlrd。
解决方案 23:
我知道应该有一个适当的方法来解决这个问题,但只是为了节省时间
我将 xlsx 表格上传到 Google 表格,然后再次从 Google 表格下载,现在可以正常工作
如果你没有时间解决问题,你可以尝试这个
解决方案 24:
?raw=true
有时在文件路径末尾添加会有所帮助。例如:
wb = xlrd.open_workbook("Z:\\Data\\Locates\\3.8 locates.xls?raw=true")
扫码咨询,免费领取项目管理大礼包!