Как объединить 200 CSV-файлов в Python - PullRequest
65 голосов
/ 25 марта 2010

Ребята, у меня здесь есть 200 отдельных CSV-файлов с именами от SH (1) до SH (200).Я хочу объединить их в один CSV-файл.Как я могу это сделать?

Ответы [ 16 ]

76 голосов
/ 25 марта 2010

Как сказал ghostdog74, но на этот раз с заголовками:

fout=open("out.csv","a")
# first file:
for line in open("sh1.csv"):
    fout.write(line)
# now the rest:    
for num in range(2,201):
    f = open("sh"+str(num)+".csv")
    f.next() # skip the header
    for line in f:
         fout.write(line)
    f.close() # not really needed
fout.close()
45 голосов
/ 04 мая 2011

Почему ты не можешь просто sed 1d sh*.csv > merged.csv?

Иногда вам даже не нужно использовать python!

35 голосов
/ 18 ноября 2016

Используйте принятый ответ StackOverflow , чтобы создать список CSV-файлов, которые вы хотите добавить, и затем запустить этот код:

import pandas as pd
combined_csv = pd.concat( [ pd.read_csv(f) for f in filenames ] )

И если вы хотите экспортировать его в один CSV-файл, используйте это:

combined_csv.to_csv( "combined_csv.csv", index=False )
16 голосов
/ 25 марта 2010
fout=open("out.csv","a")
for num in range(1,201):
    for line in open("sh"+str(num)+".csv"):
         fout.write(line)    
fout.close()
11 голосов
/ 30 июля 2013

Я просто собираюсь просмотреть другой пример кода в корзине

from glob import glob

with open('singleDataFile.csv', 'a') as singleFile:
    for csvFile in glob('*.csv'):
        for line in open(csvFile, 'r'):
            singleFile.write(line)
10 голосов
/ 25 марта 2010

Зависит от того, что вы подразумеваете под «объединением» - у них одинаковые столбцы? У них есть заголовки? Например, если все они имеют одинаковые столбцы и не имеют заголовков, достаточно простой конкатенации (откройте файл назначения для записи, переберите источники, открывающие каждый для чтения, используйте shutil.copyfileobj из open- для чтения источника в место назначения для записи, закрытие источника, продолжение цикла - используйте оператор with для закрытия от вашего имени). Если они имеют одинаковые столбцы, но также и заголовки, вам потребуется readline для каждого исходного файла, кроме первого, после того, как вы откроете его для чтения, прежде чем скопировать его в место назначения, чтобы пропустить строку заголовков.

Если файлы CSV не имеют одинаковые столбцы, вам нужно определить, в каком смысле вы их «объединяете» (например, SQL JOIN? Или «горизонтально», если все они имеют одинаковое количество строк?) и т. д.) - нам трудно догадаться, что вы имеете в виду в этом случае.

3 голосов
/ 17 сентября 2014

Небольшое изменение в коде выше, поскольку он на самом деле не работает правильно.

Это должно быть следующим ...

from glob import glob

with open('main.csv', 'a') as singleFile:
    for csv in glob('*.csv'):
        if csv == 'main.csv':
            pass
        else:
            for line in open(csv, 'r'):
                singleFile.write(line)
3 голосов
/ 25 марта 2010

Если объединенный CSV будет использоваться в Python, просто используйте glob, чтобы получить список файлов для передачи в fileinput.input() через files аргумент, затем используйте модуль csv, чтобы прочитать все за один раз.

2 голосов
/ 11 июля 2018

Если вы работаете в Linux / Mac, вы можете сделать это.

from subprocess import call
script="cat *.csv>merge.csv"
call(script,shell=True)
2 голосов
/ 11 декабря 2014

Довольно просто объединить все файлы в каталоге и объединить их

import glob
import csv


# Open result file
with open('output.txt','wb') as fout:
    wout = csv.writer(fout,delimiter=',') 
    interesting_files = glob.glob("*.csv") 
    h = True
    for filename in interesting_files: 
        print 'Processing',filename 
        # Open and process file
        with open(filename,'rb') as fin:
            if h:
                h = False
            else:
                fin.next()#skip header
            for line in csv.reader(fin,delimiter=','):
                wout.writerow(line)
...