如何从FDA官网加载Zip文件到Python并解决XLRDError问题
解决FDA伪XLS文件的加载问题
这些名为.xls的文件并非标准二进制Excel格式,而是制表符分隔的文本文件(TSV),只是被修改了后缀名。Excel因为有兼容解析能力,打开时仅弹出警告但能正常显示;但xlrd库(pd.read_excel默认依赖)只会解析标准二进制xls,因此抛出格式错误。
可行代码方案
方案1:直接远程读取Zip包内文件(无需本地解压)
import pandas as pd import zipfile import io import requests # 下载并读取FDA的Zip包 url = "https://www.accessdata.fda.gov/cder/ndcxls.zip" response = requests.get(url) zip_content = zipfile.ZipFile(io.BytesIO(response.content)) # 读取product文件(本质是TSV文本) with zip_content.open("product.xls") as f: df_product = pd.read_csv(f, sep="\t", encoding="latin-1", low_memory=False) # 读取package文件 with zip_content.open("package.xls") as f: df_package = pd.read_csv(f, sep="\t", encoding="latin-1", low_memory=False) # 验证数据 print("Product数据预览:") print(df_product.head()) print("\nPackage数据预览:") print(df_package.head())
方案2:本地解压后读取文件
如果已经手动下载解压了Zip包,直接用以下代码读取:
import pandas as pd # 读取本地的伪xls文件(实际是TSV) df_product = pd.read_csv("product.xls", sep="\t", encoding="latin-1", low_memory=False) df_package = pd.read_csv("package.xls", sep="\t", encoding="latin-1", low_memory=False) # 验证数据 print(df_product.head())
关键说明
sep="\t":指定分隔符为制表符,匹配文件的实际格式encoding="latin-1":适配文件的字符编码,避免乱码low_memory=False:关闭pandas的内存优化,避免因列类型自动推断产生的警告
内容的提问来源于stack exchange,提问作者HeapPush928
相关产品推荐
相关产品推荐

