Я пытаюсь объединить файлы CSV в папке, чтобы проанализировать их. Кроме того, я хочу добавить имя файла каждого в виде столбца, чтобы я мог выяснить, какие данные пришли из какого файла. Я смотрел на подобные вопросы, и ни один из них не работал для меня.

Вот код, который я использую. В этой папке 24 файла CSV, и поскольку объединение файлов CSV позже было бы легко с помощью cat, поэтому даже метод, позволяющий мне сказать, как я могу добавить имя файла в каждом файле, был бы идеальным. Любая помощь будет отличной.

import pandas as pd
import os
import glob
import csv
path=r'/home/videept/Downloads/A_DeviceMotion_data/A_DeviceMotion_data/dws_1/'
with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)

    for filename in glob.glob(os.path.join(path,"*.csv")):
        with open(filename, newline='') as f_input:
            csv_input = csv.reader(f_input)

            for row in csv_input:
                row.insert(0, filename)
                csv_output.writerow(row)

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

1
Videept Kohli 4 Июл 2019 в 10:29

3 ответа

Лучший ответ

Я бы сделал это следующим образом (если вы используете Python 3.4+):

import pandas as pd
from pathlib import Path

source_files = sorted(Path('path_to_source_directory').glob('*.csv'))

dataframes = []
for file in source_files:
    df = pd.read_csv(file) # additional arguments up to your need
    df['source'] = file.name
    dataframes.append(df)

all = pd.concat(dataframes)

Таким образом, в каждой строке есть столбец, представляющий исходный файл для легкой фильтрации и анализа.

1
dralshehri 4 Июл 2019 в 08:12

Во-первых, убедитесь, что все файлы CSV имеют одинаковую структуру. Затем убедитесь, что вы можете правильно прочитать один CSV-файл. Тогда вы можете сделать это итеративно:

import pandas as pd
import glob

df_all = pd.DataFrame()

for f in glob.glob("path/to/csv/files/prefix_*.csv"):

    df = pd.read_csv(f) # make sure to apply correct settings (sep, parse_dates, headers, missing_values)
    df["origin"] = f #add a column with a csv name
    df_all = df_all.append(df) #append new df to the "master" dataframe

df_all.to_csv("merged.csv")

ОБНОВИТЬ: Если вы боитесь, что все данные не поместятся в вашей памяти, взгляните на Dask библиотека.

0
Marjan Moderc 4 Июл 2019 в 08:07

Вы можете проверить этот код, не используя никаких библиотек: https://github.com/BeleganStartup/Merge-Combine-CSV- файлы --- ПИТОН

0
B. Okba 12 Июл 2019 в 20:14