jak połączyć 200 plików csv w Pythonie

Chłopaki, mam tu 200 oddzielnych plików csv nazwanych od SH (1) do SH (200). Chcę połączyć je w jeden plik csv. Jak mogę to zrobić?

Author: Chuck, 2010-03-25

14 answers

Jak powiedział ghostdog74, ale tym razem z nagłówkami:

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()
 58
Author: wisty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-25 01:20:10

Dlaczego nie możesz po prostu sed 1d sh*.csv > merged.csv?

Czasami nawet nie musisz używać Pythona!

 32
Author: blinsay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-03 21:41:01

Użyj accepted StackOverflow answer Aby utworzyć listę plików csv, które chcesz dołączyć, a następnie uruchom ten kod:

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

I jeśli chcesz wyeksportować go do jednego pliku csv, użyj tego:

combined_csv.to_csv( "combined_csv.csv", index=False )
 22
Author: scottlittle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 17:50:13
fout=open("out.csv","a")
for num in range(1,201):
    for line in open("sh"+str(num)+".csv"):
         fout.write(line)    
fout.close()
 13
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-25 00:35:48

To zależy co masz na myśli przez "scalanie" -- czy mają te same kolumny? Mają nagłówki? Na przykład, jeśli wszystkie mają te same kolumny i bez nagłówków, wystarczy prosta konkatenacja (otwórz plik docelowy do zapisu, zapętlaj źródła otwierające się do odczytu, użyj shutil.copyfileobj ze źródła otwartego do odczytu do miejsca docelowego otwartego do zapisu, Zamknij źródło, zachowaj zapętlenie -- użyj instrukcji with do zamknięcia w Twoim imieniu). Jeśli oni mieć te same kolumny, ale także nagłówki, będziesz potrzebował readline na każdym pliku źródłowym z wyjątkiem pierwszego, po otwarciu go do odczytu przed skopiowaniem do miejsca docelowego, aby pominąć linię nagłówków.

Jeśli pliki CSV nie mają tych samych kolumn, musisz określić, w jakim sensie je "scalasz" (jak połączenie SQL? lub "poziomo", jeśli wszystkie mają taką samą liczbę linii? etc, etc) - trudno nam zgadnąć, co masz na myśli w tym przypadku.

 10
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-25 00:41:28

Prześlę kolejny przykład kodu w Koszyku

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
Author: Norfeldt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 12:57:57

Jeśli scalony plik CSV będzie używany w Pythonie, wystarczy użyć glob aby uzyskać listę plików do przekazania fileinput.input() poprzez argument files, Następnie użyj csv moduł do odczytu wszystkiego za jednym zamachem.

 3
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-25 00:35:19

Mała zmiana w powyższym kodzie, ponieważ nie działa poprawnie.

Powinno być następująco...

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
Author: Adders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 11:19:53

Możesz zaimportować plik csv, a następnie zapętlić wszystkie pliki CSV, zapisując je na listę. Następnie zapisz listę z powrotem na dysk.

import csv

rows = []

for f in (file1, file2, ...):
    reader = csv.reader(open("f", "rb"))

    for row in reader:
        rows.append(row)

writer = csv.writer(open("some.csv", "wb"))
writer.writerows("\n".join(rows))

Powyższe nie jest zbyt solidne, ponieważ nie ma obsługi błędów ani nie zamyka żadnych otwartych plików. Powinno to działać niezależnie od tego, czy poszczególne pliki mają w sobie jeden lub więcej wierszy danych CSV. Również nie uruchomiłem tego kodu, ale powinien dać ci pomysł, co robić.

 1
Author: cnobile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-25 00:44:58

Całkiem łatwo połączyć wszystkie pliki w katalogu i połączyć je

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)
 1
Author: varun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-02 15:53:05

Jeśli pracujesz na Linuksie / Macu, możesz to zrobić.

from subprocess import call
script="cat *.csv>merge.csv"
call(script,shell=True)
 1
Author: sunny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-11 08:35:41

Zmodyfikowałem to, co @ wisty powiedział do pracy z Pythonem 3.x, dla tych z Was, którzy mają problem z kodowaniem, również używam modułu os, aby uniknąć twardego kodowania

import os 
def merge_all():
    dir = os.chdir('C:\python\data\\')
    fout = open("merged_files.csv", "ab")
    # first file:
    for line in open("file_1.csv",'rb'):
        fout.write(line)
    # now the rest:
    list = os.listdir(dir)
    number_files = len(list)
    for num in range(2, number_files):
        f = open("file_" + str(num) + ".csv", 'rb')
        f.__next__()  # skip the header
        for line in f:
            fout.write(line)
        f.close()  # not really needed
    fout.close()
 0
Author: Maryam Pashmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 10:03:46

Oto skrypt:

  • łączenie plików csv o nazwie SH1.csv do SH200.csv
  • utrzymanie nagłówków
import glob
import re

# Looking for filenames like 'SH1.csv' ... 'SH200.csv'
pattern = re.compile("^SH([1-9]|[1-9][0-9]|1[0-9][0-9]|200).csv$")
file_parts = [name for name in glob.glob('*.csv') if pattern.match(name)]

with open("file_merged.csv","wb") as file_merged:
    for (i, name) in enumerate(file_parts):
        with open(name, "rb") as file_part:
            if i != 0:
                next(file_part) # skip headers if not first file
            file_merged.write(file_part.read())
 0
Author: x0s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-02 11:40:07

Aktualizacja odpowiedzi wisty na python3

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")
    next(f) # skip the header
    for line in f:
         fout.write(line)
    f.close() # not really needed
fout.close()
 0
Author: ishandutta2007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-02 20:09:35