2017-10-14 53 views
0

J'ai créé une liste de fichiers comme ceci:Si j'ai une liste Python de fichiers CSV, comment puis-je les fusionner tous dans un fichier CSV géant?

merge_files = [] 
for i in range(2, 12): 
    merge_files.append(pandas.read_csv(final_user_study_path + "/P" + str(i) + "/DataCollection/data/merge.csv")) 

Je veux créer un fichier csv géant avec tous les fichiers de cette liste.

Est-ce le moyen le plus efficace de le faire?

+3

En utilisant Python pour cela est probablement excessif quand il est trivial de le faire en utilisant le shell –

+2

@matthewDaly est juste .. juste le chat ensemble. – ergonaut

+0

Même s'il est vrai que Python peut être surdimensionné pour cela, vous pouvez rapidement construire en logique en Python pour exclure certains chemins, parcourir certains sous-chemins et faire du filtrage et ainsi de suite. On ne sait pas si OP va utiliser cette fois ou plusieurs fois. –

Répondre

2

Je recommande un shell Unix. S'ils ont sans en-tête, ou seulement d'abord un en-tête:

cat file1.csv file2.csv ... fileN.csv > result.csv 

S'ils ont des en-têtes, vous devez les couper d'abord:

cat file1.csv > result.csv 
for i in {1..N}; do tail +2 file$i.csv >> result.csv; done 

Si les fichiers sont dans des répertoires différents - chemin d'utilisation à chaque fichier:

cat path1/file.csv path2/file.csv > result.csv 
+0

Est-ce que je peux toujours faire cela s'ils sont dans des répertoires différents avec le même nom de fichier? – dirtysocks45

+0

Oui, vous pouvez, utilisez simplement le bon chemin vers n'importe quel fichier. –

0

La façon de pandas géants serait d'utiliser concat sur les dataframes, cela peut être utile si vous voulez faire des opérations trop (comme le filtrage, la suppression des doublons, etc ...)

import io 
import pandas as pd 

Créons deux fichiers

csv1 = "a,b\n1,2" 
csv2 = "a,b\n3,4" 

file1 = io.StringIO(csv1) 
file2 = io.StringIO(csv2) 

boucle sur eux et concat:

pd.concat((pd.read_csv(i) for i in [file1,file2])).to_csv(index=False) 

Résultats dans:

'a,b\n1,2\n3,4\n' 

Adaptée aux ans u d'une manière lisible (ma façon préférée):

files = [] 
for i in range(2, 12): 
    path = "{}/P{}/DataCollection/data/merge.csv".format(final_user_study_path,i) 
    files.append(path) 

pd.concat((pd.read_csv(i) for i in files)).to_csv("output.csv",index=False)