如何读取多个 zip 文件中的所有 csv 文件?

Posted

技术标签:

【中文标题】如何读取多个 zip 文件中的所有 csv 文件?【英文标题】:How to read all csv files in multiple zip files? 【发布时间】:2020-10-21 07:53:43 【问题描述】:

我有一个包含许多 zip 文件的文件夹,这些 zip 文件中有多个 csv 文件。 有没有办法在 python 的一个数据框中获取所有 .csv 文件? 或者我可以通过任何方式传递 zip 文件列表?

我目前正在尝试的代码是:

import glob
import zipfile
import pandas as pd

for zip_file in glob.glob(r"C:\Users\harsh\Desktop\Temp\data_00-01.zip"):
    # This is just one file. There are multiple zip files in the folder
    zf = zipfile.ZipFile(zip_file)
    dfs = [pd.read_csv(zf.open(f), header=None, sep=";", encoding='latin1') for f in zf.namelist()]
    df = pd.concat(dfs,ignore_index=True)
    print(df)

此代码适用于一个 zipfile,但我的文件夹中有大约 50 个 zip 文件,我想在一个数据帧中读取并连接这些 zip 文件中的所有 csv 文件。

谢谢

【问题讨论】:

您需要获取文件夹中所有文件的名称。请参阅此处了解如何做到这一点:***.com/questions/3207219/… 【参考方案1】:

以下代码应满足您的要求(只需根据您的需要编辑dir_name):

import glob
import zipfile
import pandas as pd

dfs = []
for filename in os.listdir(dir_name):
    if filename.endswith('.zip'):
        zip_file = os.path.join(dir_name, filename)
        zf = zipfile.ZipFile(zip_file)
        dfs += [pd.read_csv(zf.open(f), header=None, sep=";", encoding='latin1') for f in zf.namelist()]
df = pd.concat(dfs,ignore_index=True)

【讨论】:

代码仍然只读取 1 个 zip 文件。我应该在 dfs = [] 中列出 zip 文件名吗?另外我会在哪里提供文件夹的路径? 我用os.listdir(r"C:\Users\harsh\Desktop\Temp") 替换了os.listdir(dir_name),我收到了这个错误FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\harsh\\AppData\\Roaming\\JetBrains\\PyCharmCE2020.2\\scratches\\data_00-01.zip'。我该如何解决? 太棒了!现在可以了。我看到了我的错误。但是,现在,我得到一列,其中包含数据框中的所有值,没有标题。有没有办法让数据框根据列标题和相应的值进行格式化?谢谢 你能提供当前的输出,和预期的输出吗? 当然!请找到当前输出 here 和预期输出文件 here 。预期的输出在"C:\Users\harsh\Desktop\Temp\data_19-20.zip" 文件中

以上是关于如何读取多个 zip 文件中的所有 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spark(python)读取 zip 文件中的 CSV 文件的内容 [重复]

读取 zip 中的所有 csv 文件,并将相应的 csv 文件名作为数据帧变量名

如何提取多个 zip 文件并在 R 中读取这些 csv? [复制]

如何从压缩文件中读取多个文件?

如何从 zip 文件夹中的 csv 文件中读取数据并将 csv 文件中的数据保存在数据库中?

从 Python3 中的 .zip 文件中提取和读取 [重复]