Python - Pandas объединяет несколько текстовых файлов в нескольких Zip-файлах - PullRequest
0 голосов
/ 31 августа 2018

У меня проблемы с получением TXT-файлов, расположенных в заархивированных файлах, для загрузки / объединения с помощью панд. Здесь есть много примеров с pd.concat (zip_file.open), но в моем случае ничего не получается, так как у меня более одного zip-файла и несколько txt-файлов в каждом.

Например, допустим, у меня есть ДВА архива в определенной папке «Main». Каждый заархивированный файл содержит ПЯТЬ текстовых файлов каждый. Я хочу прочитать все эти текстовые файлы и 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 голосов
/ 31 августа 2018

Это не эффективно, но оно должно дать вам некоторое представление о том, как это можно сделать.

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

В зависимости от объема данных вам придется разработать решение, которое уравновешивает вычислительную мощность / память / дисковое пространство. Это решение может потенциально использовать много памяти.

...