熊猫。如何从 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)

如何在 Python 中读取带有熊猫的 .p 存档文件?

使用 Haskell 的 zip-conduit 从 zip 存档中的文件中读取行

从文件模式为读取的文件流创建存档 .zip

PHP 从 Zip 存档中读取

如何使用 Java 将每个文件存储在 zip 存档中的数组中?