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ć?
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()
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!
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 )
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()
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.
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)
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.
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)
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ć.
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)
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)
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()
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
doSH200.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())
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()
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