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

joh*_*nyb 6 python zip python-3.x pandas

我有多个包含不同类型的txt文件的zip文件.如下所示:

zip1 
  - file1.txt
  - file2.txt
  - file3.txt
Run Code Online (Sandbox Code Playgroud)

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

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

df = pd.read_csv(textfile.zip, compression='zip') 
Run Code Online (Sandbox Code Playgroud)

任何有关如何做到这一点的帮助都会很棒.

Ste*_*uch 15

您可以传递ZipFile.open()以从包装到多文件中的csv文件pandas.read_csv()构造一个.pandas.DataFramezip

码:

pd.read_csv(zip_file.open('file3.txt'))
Run Code Online (Sandbox Code Playgroud)

将所有内容读.csv入dict的示例:

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')}
Run Code Online (Sandbox Code Playgroud)

  • 如果我有“zipfile”的 url 怎么办?仅当我的本地计算机上有它时它才有效! (3认同)
  • @FaridAlijani,@nitinkhatri789,每次运行代码时下载整个数据集通常是一个坏主意。大多数时候,最好手动下载 zip 文件并在本地访问。如果您确实需要,您仍然可以使用“urllib.request.url_retrieve”。 (2认同)

val*_*nmk 8

处理此问题的最简单方法(如果您将一个大 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
)
Run Code Online (Sandbox Code Playgroud)