【问题标题】:Pandas. How to read Excel file from ZIP archive熊猫。如何从 ZIP 存档中读取 Excel 文件
【发布时间】: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,我没关系。首先我想打开它。你能帮帮我吗?

标签: python pandas zipfile


【解决方案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 在 StackOverflow 上有大量示例,展示了如何分解 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 = ''

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2020-02-10
    • 1970-01-01
    • 2019-01-26
    • 2012-05-12
    相关资源
    最近更新 更多