熊猫。如何从 ZIP 存档中读取 Excel 文件
Posted
技术标签:
【中文标题】熊猫。如何从 ZIP 存档中读取 Excel 文件【英文标题】:Pandas. How to read Excel file from ZIP archive 【发布时间】:2018-03-07 16:42:23 【问题描述】:我有一个包含 filename.xlsx 的 .zip 存档,我想逐行解析 Excel 工作表。
在这种情况下如何正确地将文件名传递给 pandas.read_excel?
我试过了:
import zipfile
import pandas
myzip=zipfile.ZipFile(filename.zip)
for fname in myzip.namelist():
with myzip.open(fname) as from_archive:
with pandas.read_excel(from_archive) as fin:
for line in fin:
....
但是好像不行,结果是:
AttributeError: __exit__
【问题讨论】:
如果您的 ZIP 文件包含多个 .XLS(X) 文件怎么办? 您应该编辑您的问题以包含myzip
的声明,而不是将其添加为评论。
@MaxU,现在没关系。目标是解决最简单的情况。
@IvanVodopyanov,你为什么要逐行阅读——它有那么大,无法放入内存吗?
@MaxU,我没关系。首先我想打开它。你能帮帮我吗?
【参考方案1】:
您可以将 zip 文件提取到内存中的变量中,然后使用 io.BytesIO
解析它:
import io
from zipfile import ZipFile
import pandas as pd
def read_zip(zip_fn, extract_fn=None):
zf = ZipFile(zip_fn)
if extract_fn:
return zf.read(extract_fn)
else:
return name:zf.read(name) for name in zf.namelist()
用法:
df = pd.read_excel(io.BytesIO(read_zip(r'C:\download\test.xlsx.zip', 'test.xlsx')))
或者,您可以将压缩文件中的文件提取到磁盘并将它们解析为常规文件。
PS 在 *** 上有大量示例,展示了如何分解 zip 文件...
【讨论】:
干得好——压缩文件是什么,是一个 URL?显然 read_excel 方法不能接受也是 zip 的 URL(其中嵌入了 .xlsx) @leeprevost,我会先使用requests
下载这样一个zip 文件,然后使用答案中的read_zip()
函数;)
无论如何要为 xlrs 而不是 pandas 做这个?【参考方案2】:
使用压缩文件
import zipfile
archive = zipfile.ZipFile('filename.zip', 'r')
xlfile = archive.open('filename.xlsx')
df = pd.read_excel(xlfile)
【讨论】:
他们已经在使用zipfile
,问题是试图使用pd.read_excel
作为上下文管理器
@Floydian,我想你的答案和我的问题一样。我说的对吗?【参考方案3】:
简单的方法是:
df = pd.read_csv('文件路径', compression='zip').
如果你需要你可以添加额外的 atr: encoding = 'windows-1251' and sep = ''
【讨论】:
以上是关于熊猫。如何从 ZIP 存档中读取 Excel 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何从嵌套存档中读取 ZipEntry CRC(zip in zip)