Python-熊猫在多个Zip文件中连接多个文本文件

时间:2018-08-30 21:24:17

标签: python pandas zipfile

我在获取位于压缩文件中的txt文件以使用熊猫加载/连接时遇到问题。这里有很多使用pd.concat(zip_file.open)的示例,但是对于我来说仍然无法正常工作,因为我每个都有多个zip文件和多个txt文件。

例如,假设我在特定的文件夹“ Main”中有两个压缩文件。每个压缩文件包含五个txt文件。我想阅读所有这些txt文件并将其全部pd.concat一起阅读。在我的真实示例中,我将有数十个zip文件夹,每个文件夹包含五个txt文件。

可以帮忙吗?

示例的文件夹和文件结构:

'C:/User/Example/Main'   
   TAG_001.zip
     sample001_1.txt
     sample001_2.txt
     sample001_3.txt
     sample001_4.txt
     sample001_5.txt
   TAG_002.zip
     sample002_1.txt
     sample002_2.txt
     sample002_3.txt
     sample002_4.txt
     sample002_5.txt

我是这样开始的,但是此后的一切都会引发错误:

import os
import glob
import pandas as pd
import zipfile

path = 'C:/User/Example/Main'

ziplist = glob.glob(os.path.join(path, "*TAG*.zip"))

1 个答案:

答案 0 :(得分:1)

这不是很有效,但是应该可以让您了解如何实现。

import os
import zipfile

import pandas as pd

frames = {}

BASE_DIR = 'C:/User/Example/Main'
_, _, zip_filenames = list(os.walk(BASE_DIR))[0]
for zip_filename in zip_filenames:
    with zipfile.ZipFile(os.path.join(BASE_DIR, zip_filename)) as zip_:
        for filename in zip_.namelist():
            with zip_.open(filename) as file_:
                new_frame = pd.read_csv(file_, sep='\t')
                frame = frames.get(filename)
                if frame is not None:
                    pd.concat([frame, new_frame])
                else:
                    frames[filename] = new_frame

#once all frames have been concatenated loop over the dict and write them back out

根据要存储的数据量,您必须设计一种平衡处理能力/内存/磁盘空间的解决方案。此解决方案可能会占用大量内存。