使用 pandas 读取 zip 文件中包含的多个文件

问题描述 投票:0回答:5

我有多个 zip 文件,其中包含不同类型的 txt 文件。 如下:

zip1 
  - file1.txt
  - file2.txt
  - file3.txt

如何使用 pandas 读取每个文件而不解压它们?

我知道如果每个 zip 有 1 个文件,我可以使用 read_csv 的压缩方法,如下所示:

df = pd.read_csv(textfile.zip, compression='zip') 

任何有关如何执行此操作的帮助都会很棒。

python python-3.x pandas zip
5个回答
62
投票

您可以将

ZipFile.open()
传递给
pandas.read_csv()
,从打包到多文件
pandas.DataFrame
的 csv 文件构建
zip

代码:

pd.read_csv(zip_file.open('file3.txt'))

将所有
.csv
读入字典的示例:

from zipfile import ZipFile

zip_file = ZipFile('textfile.zip')
dfs = {text_file.filename: pd.read_csv(zip_file.open(text_file.filename))
       for text_file in zip_file.infolist()
       if text_file.filename.endswith('.csv')}

9
投票

处理此问题的最简单方法(如果您将一个大 csv 文件的多个部分压缩为一个 zip 文件)。

import pandas as pd
from zipfile import ZipFile

df = pd.concat(
    [pd.read_csv(ZipFile('some.zip').open(i)) for i in ZipFile('some.zip').namelist()],
    ignore_index=True
)

2
投票

不久前我对 XML 文件也遇到了类似的问题。 zipfile 模块可以帮助您实现目标。

from zipfile import ZipFile

z = ZipFile(yourfile)

text_files = z.infolist()

for text_file in text_files:
    z.read(text_file.filename)

如果您想将它们连接到 pandas 对象中,那么它可能会变得更复杂一些,但这应该可以帮助您开始。请注意,

read
方法返回字节,因此您可能也必须处理它。


1
投票

对于 zip 文件中有空 txt 文件的人:

from zipfile import ZipFile
z = ZipFile('textfile.zip')
df = pd.concat(
    [pd.read_csv(z.open(i.filename)) for i in z.infolist() if i.compress_size > 0],
    ignore_index=True)

否则,会出现“pandas.errors.EmptyDataError: No columns to parse from file”。


0
投票

valentinmk 的答案是一个很好的答案。对它进行一项小小的更改,可确保 zip 文件内有文件夹或其他文件时不会出现错误。所以我添加了 if endwith。

import pandas as pd
from zipfile import ZipFile

df = pd.concat(
    [pd.read_csv(ZipFile('some.zip').open(i)) for i in ZipFile('some.zip').namelist() if i.endswith('.csv')],
    ignore_index=True
)
© www.soinside.com 2019 - 2024. All rights reserved.