¿Cómo puedo combinar 200 archivos CSV en Python?

5 minutos de lectura

Avatar de usuario de Chuck
Arrojar

Aquí tengo 200 archivos CSV separados nombrados de SH (1) a SH (200). Quiero fusionarlos en un solo archivo CSV. ¿Cómo puedo hacerlo?

  • ¿De qué manera los fusionarías? (Concatenar líneas, …)

    – girando

    25 de marzo de 2010 a las 0:29


  • ¿Cómo quieres que se fusionen? Cada línea en un archivo CSV es una fila. Entonces, una opción simple es concatenar todos los archivos juntos.

    – Jon Eric

    25 de marzo de 2010 a las 0:31

  • Cada archivo tiene dos columnas. Quiero fusionarlos en un solo archivo con dos columnas consecutivas.

    – mandril

    25 de marzo de 2010 a las 12:29

  • @Chuck: ¿Qué tal tomar todas las respuestas en sus comentarios (a la pregunta ya las respuestas) y actualizar su pregunta?

    – tumultous_rooster

    17 de agosto de 2015 a las 19:29

  • Esta pregunta debe llamarse “¿Cómo concat…” en lugar de “cómo unir…”

    – colidiro

    5 de agosto de 2018 a las 10:09

avatar de usuario de wisty
Wisty

Como dijo ghostdog74, pero esta vez con encabezados:

with open("out.csv", "ab") as fout:
    # first file:
    with open("sh1.csv", "rb") as f:
        fout.writelines(f)
    # now the rest:    
    for num in range(2, 201):
        with open("sh"+str(num)+".csv", "rb") as f:
            next(f) # skip the header, portably
            fout.writelines(f)

  • puedes usar f.__next__() en cambio si f.next() en python3.x.

    – tsveti_iko

    29 de enero de 2018 a las 14:30

  • Sólo una nota: Uno puede usar el with open sintaxis y evitar manualmente .close()ing los archivos.

    – Fatih Akici

    8 de junio de 2018 a las 18:18

  • Cuál es la diferencia entre f.next() y f.__next__()? cuando uso el primero, tengo '_io.TextIOWrapper' object has no attribute 'next'

    – Jason Gol

    8 sep 2018 a las 0:40


  • antes fout.write(line) Yo lo haría: if line[-1] != '\n': line += '\n'

    – shisui

    25 de octubre de 2018 a las 0:48


  • @tsveti_iko: Portable, lo harías next(f)que funciona en todas las versiones de Python desde la 2.6 en adelante.

    – ShadowRanger

    14 de noviembre de 2022 a las 19:06

¿Por qué no puedes simplemente sed 1d sh*.csv > merged.csv?

¡A veces ni siquiera tienes que usar python!

  • En Windows, C:\> copiar *.csv merged.csv

    – ataque aéreo

    17 de junio de 2011 a las 13:30


  • Copie la información del encabezado de un archivo: sed -n 1p some_file.csv > merged_file.csv Copie todas las líneas menos la última de todos los demás archivos: sed 1d *.csv >> merged_file.csv

    – se comporta

    11/10/2011 a las 17:39

  • @blinsay Sin embargo, también agrega el encabezado en cada archivo CSV al archivo combinado.

    – mina

    2 de mayo de 2014 a las 1:51

  • ¿Cómo usa este comando sin copiar la información del encabezado para cada archivo subsiguiente después del primero? Parece que la información del encabezado aparece repetidamente.

    – José

    27 de agosto de 2014 a las 4:57

  • ¡Esto es genial si no necesita eliminar el encabezado!

    – Blairg23

    04/01/2016 a las 22:28

avatar de usuario de scottlittle
scottlittle

Use la respuesta aceptada de StackOverflow para crear una lista de archivos csv que desea agregar y luego ejecute este código:

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

Y si desea exportarlo a un solo archivo csv, use esto:

combined_csv.to_csv( "combined_csv.csv", index=False )

  • @wisty,@Andy, supongamos que todos los archivos tienen títulos para cada fila, algunas filas con títulos diferentes. No hay encabezados para las 2 columnas en cada archivo. ¿Cómo se puede fusionar, de modo que para cada archivo solo se agregue una columna?

    – Gathide

    6 de enero de 2017 a las 11:14


  • ¿A dónde se exporta el archivo?

    usuario2398046

    5 de diciembre de 2017 a las 17:52

  • @ Dirtysocks45, cambié la respuesta para hacer esto más explícito.

    – scottlittle

    6 de diciembre de 2017 a las 17:51

  • agregar ordenación: combine_csv = pd.concat( [pd.read_csv(f) for f in filenames ]ordenar=Falso)

    – pez vela009

    19 de septiembre de 2019 a las 4:28

  • ¡para miles de archivos csv se necesita mucho tiempo y mucha memoria!

    – SIslam

    9 de julio de 2022 a las 7:47

fout=open("out.csv","a")
for num in range(1,201):
    for line in open("sh"+str(num)+".csv"):
         fout.write(line)    
fout.close()

Avatar de usuario de Norfeldt
Norfeldt

Solo voy a lanzar otro ejemplo de código a la cesta:

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)

  • @Andy No veo la diferencia entre stackoverflow que me recuerda que vote una respuesta y yo que le recuerdo a la gente que comparta su agradecimiento (votando) si encuentran útil mi respuesta. Sé que esto no es Facebook y no soy un cazador de likes..

    – Norfeldt

    1 mayo 2014 a las 10:20


  • Ha sido discutido previamentey cada vez que ha sido considerado inaceptable.

    – Andy

    1 mayo 2014 a las 13:02

Avatar de usuario de Alex Martelli
alex martelli

Depende de lo que quiera decir con “fusionar”: ¿tienen las mismas columnas? ¿Tienen encabezados? Por ejemplo, si todos tienen las mismas columnas y no tienen encabezados, la concatenación simple es suficiente (abra el archivo de destino para escribir, recorra las fuentes abriendo cada una para lectura, use Shutil.copyfileobj desde la fuente abierta para lectura hasta el destino abierto para escritura, cierre la fuente, siga recorriendo — use el with declaración para hacer el cierre en su nombre). Si tienen las mismas columnas, pero también encabezados, necesitará un readline en cada archivo de origen excepto el primero, después de abrirlo para leerlo antes de copiarlo en el destino, para omitir la línea de encabezados.

Si los archivos CSV no tienen todos las mismas columnas, entonces debe definir en qué sentido los está “fusionando” (¿como un SQL JOIN? ¿O “horizontalmente” si todos tienen la misma cantidad de líneas? etc, etc. ) — es difícil para nosotros adivinar lo que quiere decir en ese caso.

  • @Andy No veo la diferencia entre stackoverflow que me recuerda que vote una respuesta y yo que le recuerdo a la gente que comparta su agradecimiento (votando) si encuentran útil mi respuesta. Sé que esto no es Facebook y no soy un cazador de likes..

    – Norfeldt

    1 mayo 2014 a las 10:20


  • Ha sido discutido previamentey cada vez que ha sido considerado inaceptable.

    – Andy

    1 mayo 2014 a las 13:02

avatar de usuario de gogocatmario
gogocatmario

Bastante fácil de combinar todos los archivos en un directorio y fusionarlos

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)

¿Ha sido útil esta solución?