La concaténation de plusieurs fichiers csv en un seul csv avec la même tête de Python
Je suis actuellement en utilisant le code ci-dessous pour importer de 6000 fichiers csv (avec les en-têtes) et de l'exporter dans un fichier csv (avec une seule ligne d'en-tête).
#import csv files from folder
path =r'data/US/market/merged_data'
allFiles = glob.glob(path + "/*.csv")
stockstats_data = pd.DataFrame()
list_ = []
for file_ in allFiles:
df = pd.read_csv(file_,index_col=None,)
list_.append(df)
stockstats_data = pd.concat(list_)
print(file_ + " has been imported.")
Ce code fonctionne très bien, mais il est lent. Il peut prendre jusqu'à 2 jours.
M'a donné une seule ligne de script pour le Terminal de ligne de commande qui fait la même chose (mais sans les en-têtes). Ce script prend 20 secondes.
for f in *.csv; do cat "`pwd`/$f" | tail -n +2 >> merged.csv; done
Personne ne sait comment je peux accélérer le premier script Python? Réduire le temps vers le bas, j'ai pensé à pas de l'importer dans un DataFrame et juste de la concaténation de la CSVs, mais je ne peux pas le comprendre.
Grâce.
OriginalL'auteur mattblack | 2017-06-27
Vous devez vous connecter pour publier un commentaire.
Si vous n'avez pas besoin de le CSV en mémoire, juste de la copie à partir de l'entrée à la sortie, ça va être beaucoup moins cher pour éviter d'analyse, et de copier sans s'accumulent dans la mémoire:
C'est elle;
shutil.copyfileobj
gère efficacement la copie de données, réduisant ainsi considérablement le Python de travail pour analyser et reserialize.Cela suppose que tous les fichiers CSV ont le même format, encodage, les fins de ligne, etc., et l'en-tête ne contient pas intégré les retours à la ligne, mais si c'est le cas, c'est beaucoup plus rapide que les solutions de rechange.
Belle réponse parfaite ..
Pourriez-vous s'il vous plaît également partager une méthode pour diviser un grand csv en fichiers multiples et de garder la tête dans chacun des petits fichiers?
C'est une toute autre question, pas vraiment adapté pour répondre dans les commentaires, et pas approprié pour répondre à l'OP de la question. En supposant que l'un des beaucoup de questions sur ce sujet ne couvre pas, n'hésitez pas à poser votre propre question sur le sujet. Il va avoir besoin de beaucoup plus de détails à répondre (par exemple, êtes-vous diviser par le nombre de lignes, le nombre d'octets, etc.), et le
csv
module sera nécessaire (car vous en aurez besoin pour bien séparer les lignes).Merci. Je vais soulever une question distincte pour cela et de partager un lien.. il y a des solutions mais je suis à la recherche d'optimisé.. j'aime celui que vous avez partagé ci-dessus.
OriginalL'auteur ShadowRanger
Êtes-vous obligé de le faire en Python? Si vous êtes ouvert à le faire entièrement en shell, tout ce que vous devez faire est d'abord
cat
la ligne d'en-tête à partir d'un au hasard d'entrée sélectionné .fichier csv dansmerged.csv
avant l'exécution de votre one-liner:J'aurais pensé que c'était le cas. Espérons-le, d'Alexandre réponse qui fonctionne pour vous!
OriginalL'auteur Peter Leimbigler
Vous n'avez pas besoin de pandas pour cela, il suffit de la simple
csv
module marcherait bien.\r\n
les fins de ligne dans le entrées à\n
les fins de ligne dans la sortie). Malheureusement, il n'est pas possible de le rendre totalement portable, sans beaucoup d'effort ou de modules tiers (parce que lecsv
module nécessite binaire I/O sur Py2, et le texte I/O avecnewline=''
sur Py3). 2) (Mineur) Si rien d'autre,headers = reader.next()
pourrait être changé pourheaders = next(reader)
pour le faire fonctionner sur 2.6-3.x, et pas seulement 2.x.OriginalL'auteur Alexander
Voici une approche plus simple - vous pouvez utiliser les pandas (même si je ne suis pas sûr de savoir comment ça va aider à l'utilisation de la RAM)-
OriginalL'auteur markroxor