如何在Jupyter notebook中读取伪装为Excel的Web Archive格式文件
报错原因
XLRDError:你的文件并非标准二进制XLS格式,本质是MIME封装的Web Archive单文件网页,pandas.read_excel依赖的xlrd库只能识别标准XLS文件的开头BOF记录,无法解析网页格式内容。AttributeError:pandas.read_html的返回值为列表结构,列表中每个元素对应网页内的一个表格的DataFrame对象,不能直接对列表调用DataFrame专属的head()方法。
解决方法
方案1:直接读取(适用于大部分场景)
这类Excel导出的网页格式文件通常页面内仅包含一个业务表格,直接取read_html返回列表的第一个元素即可:
import pandas as pd # 读取文件得到表格列表 table_list = pd.read_html("你的目标文件.xls") # 取第一个表格即为目标数据 df = table_list[0] # 可正常调用DataFrame方法 df.head()
如果文件内存在多个表格,可遍历列表确认你需要的表格索引:
for idx, table in enumerate(table_list): print(f"第{idx}个表格前5行:") display(table.head()) print("-"*50)
方案2:先解析MIME封装再读取(适用于方案1失效的场景)
如果是标准multipart/related封装的Web Archive文件,需要先提取封装内的HTML内容再解析表格:
import email from email.policy import default import pandas as pd from io import StringIO # 读取源文件解析MIME结构 with open("你的目标文件.xls", "r", encoding="utf-8") as f: msg = email.message_from_string(f.read(), policy=default) # 遍历MIME分段提取HTML内容 html_content = "" for part in msg.walk(): if part.get_content_type() == "text/html": html_content = part.get_content() break # 解析HTML内的表格 df = pd.read_html(StringIO(html_content))[0] df.head()
提示:如果读取时出现编码报错,可将
open函数的encoding参数改为gbk或gb2312尝试,Windows平台导出的这类文件常使用中文编码。
拿到df对象后,即可正常执行删除列、筛选、复制等pandas常规数据操作,和Excel打开的表格结构完全一致。
内容的提问来源于stack exchange,提问作者Ian Weng
相关产品推荐
相关产品推荐

