Как читать несколько текстовых файлов, когда мы читаем все текстовые файлы только одной группы? - PullRequest
1 голос
/ 07 мая 2020

У меня есть несколько текстовых файлов в моем каталоге, например,

id-2020-01-21-22.txt
id-2020-01-21-23.txt
id-2020-01-22-00.txt
id-2020-01-22-01.txt
id-2020-01-22-02.txt
id-2020-01-23-00.txt
id-2020-01-24-00.txt

Итак, как я могу прочитать их, например, где я сначала прочитал id-2020-01-21-22.txt и id-2020-01-21-23.txt вместе, превратить их в фрейм данных, запишите их в объединенный текстовый файл, затем id-2020-01-22-00.txt & id-2020-01-22-01.txt & id-2020-01-22-02.txt все вместе, запишите их во фрейм данных и так далее до последнего файла в каталоге.

внутренняя структура всех текстовый файл выглядит так:

100232323\n
903812398\n
284934289\n
{empty line placeholder}

Без заголовка, но каждый текстовый файл имеет пустую строку в конце. Я новичок в python, буду благодарен, если вы можете мне помочь.

Вот как далеко я продвинулся:

import os

new_list = []
for root, dirs, files in os.walk('./textFilesFolder'):
    for file in files:
        if file.endswith('.txt'):
            with open(os.path.join(root, file), 'r') as f:
                text = f.read()
                new_list.append(text)


print(new_list)

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вы также можете попробовать сделать это так для удобства чтения.

from collections import defaultdict
import os
import pandas as pd

data = defaultdict(list)
for i in (os.listdir('files/')): # here files is a folder in current directory.
    print(i)                     # which has your text files.
    column = i.split('-')[3]
    with open('files/'+i, 'r') as f:
        file_data = f.read().replace('\n', ' ').split(' ')
        data[column].extend(file_data[:-1])
df = pd.DataFrame(data)
print('---')
print(df)

Вывод:

id-2020-01-22-01.txt
id-2020-01-22-00.txt
id-2020-01-21-23.txt
id-2020-01-21-22.txt
---
          22          21
0    1006523  1002323212
1   90381122  9038123912
2   28493423   284934212
3  100232323   100232323
4  903812332   903812392
5  284934212   284934289
1 голос
/ 08 мая 2020

Вам нужны ежедневные сводки, в которых почасовые файлы объединяются. Хорошо, хорошо.

Создайте дату Ymd regex :

import re

date_re = re.compile(r'^id-(\d{4}-\d{2}-\d{2})-\d{2}\.txt$')
prev_date = None

Теперь в вашем l oop вы можете заменить существующий if на:

        m = date_re.search(file)
        if m:
            date = m.group(1)
            print(f'Working on day {date} ...')
            ...
            prev_date = date

Разобрав дату, теперь вы можете заметить, когда она меняется, возможно, сравнивая, prev_date == date, и предпринять соответствующие действия, например, записать в новый файл.

Или подумать используя with open(f'output-{date}.txt', 'a') as fout:, чтобы вы могли добавить к (потенциально уже существующему) файлу. Таким образом, файловая система запоминает вещи за вас, вместо того, чтобы отслеживать большее количество переменных в вашей программе.

Кстати, использование walk() - это прекрасно, спасибо за это. Но для этого каталога файлов структура достаточно проста, чтобы вы могли использовать glob :

new_list = []
for file in glob.glob('id-*.txt'):
    ...

EDIT

Предположим, мы начинаем с чистого листа, без вывода files:

$ rm output-*.txt

Затем мы могли бы просто добавить в al oop, аналогично $ cat hour01 hour02 > day31. Или то же самое, похожее на $ rm day31; cat hour01 >> day31; cat hour02 >> day31.

        m = date_re.search(file)
        if m:
            date = m.group(1)
            print(f'Working on day {date} ...')
            with open(file) as fin:
                with open(f'output-{date}.txt', 'a') as fout:
                    fout.write(fin.read())

И все, готово! Мы читаем ежечасный текст и записываем его в конец ежедневного файла.

Я упомянул rm выше, потому что, если вы отлаживаете и запускаете это дважды или N раз, вы получите с выходным файлом, в N раз большим, чем вы рассчитывали.

...