Конкат файлы в одном каталоге в зависимости от их расширения - PullRequest
0 голосов
/ 23 октября 2019

У меня есть каталог, который содержит несколько файлов большого размера с различными расширениями:

file1.csv
file2.csv
text_file.txt
text_file2.txt
json_file.json
json_file2.json
...

Моя цель - объединить все файлы в три группы в зависимости от их расширения. Скрипту не нужно объединять все за один прогон, я могу изменить расширение и запустить скрипт 3 раза. Основная цель - объединить все файлы определенного типа (скажем, .csv) в одну категорию. Я нашел этот скрипт в stackoverflow, но он выдает мне ошибки:

import os
import glob
import pandas as pd

os.chdir("/Users/user/Desktop")
extension = 'csv'
all_filenames = [i for i in glob.glob(f'*.{extension}')]
#combine all files in the list
combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames])
#export to csv
combined_csv.to_csv("combined_csv.csv", index=False, encoding='utf-8-sig')

Код выдает мне эту ошибку:

  File "pandas/_libs/parsers.pyx", line 543, in pandas._libs.parsers.TextReader.__cinit__
pandas.errors.EmptyDataError: No columns to parse from file

Другая сторона вопроса была бы с точки зрения эффективности памяти, когда я должен начать объединять файлы построчно, а не весь файл.

1 Ответ

0 голосов
/ 23 октября 2019

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

# cat_header.py
import sys
import pandas as pd

header = True
for file in sys.argv[2:]:
    pd.read_csv(file).to_csv(sys.argv[1], header=header, index=False, mode="a")
    header = False

Он работает как:

python3 cat_header.py output.csv *.csv

Для .txt файлов:

# cat_files.py
import sys

with open(sys.argv[1], "w") as out_fh:
    for file in sys.argv[2:]:
        with open(file, "r") as in_fh:
            out_fh.write("".join(in_fh.readlines()))

Работает как:

python3 cat_files.py output.txt *.txt
...