Слияние CSV с похожим именем Python

конспект

Учитывая каталог, содержащий файлы CSV, названные с шаблоном Prefix-Year.csv, создайте новый набор файлов CSV с именем Prefix-aggregate.csv, где каждый агрегатный файл является комбинацией всех файлов CSV с одинаковым префиксом.

объяснение

У меня есть каталог, содержащий 5500 CSV-файлов, названных по этому шаблону: Prefix-Year.csv. Пример:

18394-1999.csv
   . . .       //consecutive years
18394-2014.csv
18395-1999.csv //next location

Я хочу сгруппировать и объединить файлы с общими префиксами в файлы с именем Prefix-aggregate.csv.

2 ответа

Решение

Решением вашего вопроса является find_filesets() метод ниже. Я также включил метод слияния CSV, основанный на ответе MaxNoe.

#!/usr/bin/env python

import glob
import random
import os
import pandas

def rm_minus_rf(dirname):
    for r,d,f in os.walk(dirname):
        for files in f:
            os.remove(os.path.join(r, files))
        os.removedirs(r)

def create_testfiles(path):
    rm_minus_rf(path)
    os.mkdir(path)

    random.seed()
    for i in range(10):
        n = random.randint(10000,99999)
        for j in range(random.randint(0,20)):
            # year may repeat, doesn't matter
            year = 2015 - random.randint(0,20)
            with open("{}/{}-{}.csv".format(path, n, year), "w"):
                pass

def find_filesets(path="."):
    csv_files = {}
    for name in glob.glob("{}/*-*.csv".format(path)):
        # there's almost certainly a better way to do this
        key = os.path.splitext(os.path.basename(name))[0].split('-')[0]
        csv_files.setdefault(key, []).append(name)

    for key,filelist in csv_files.items(): 
        print key, filelist
        # do something with filelist
        create_merged_csv(key, filelist)

def create_merged_csv(key, filelist):
    with open('{}-aggregate.csv'.format(key), 'w+b') as outfile:
        for filename in filelist:
            df = pandas.read_csv(filename, header=False)
            df.to_csv(outfile, index=False, header=False)

TEST_DIR_NAME="testfiles"
create_testfiles(TEST_DIR_NAME)
find_filesets(TEST_DIR_NAME)

Как насчет этого:

import os
import pandas as pd

root, dirs, files = next(os.walk('data_dir'))

with open('18394_aggregate.csv', 'a') as outfile:
    for infile in files:
        if infile.startswith('18394') and infile.endswith('.csv'):
            df = pd.read_csv(os.path.join(root, infile), header=False)
            df.to_csv(outfile, index=False, header=False)
Другие вопросы по тегам