Unire tanti files .csv in un unico

Standard

Ieri mi contatta la mia capa e mi dice “Ciao Davide (sempre molto gentile) ho questi 1444 files .csv da unire insieme in più per ogni riga che contengono vorrei aggiungere anno e ora”…e finisce…”ne avrei bisogno per domani, grazie! (sempre gentilissima 😅) .

Soluzioni a problemi di questo tipo ce ne sono molte…ma non so perché mi è venuto in mente il titolo di un libro che avevo iniziato a leggere:

Mi sono messo a vedere le caratteristiche di questi files:

  • Tutti avevano nel nome anno, data e ora (tipo 2020092610456521Z.csv)
  • Tutti erano .csv
  • Tutti avevano una intestazione
  • Tutti avevano le stesse colonne
  • Tutti erano contenuti nella stessa cartella
  • avevano una riga vuota alla fine

Bene avendo un scenario di questo tipo ho deciso che avrei proceduto in questo modo:

  • Letto il contenuto della cartella selezionando solo i file con estensione .csv
  • Creato un nuovo file che contenesse il contenuto di tutti i 1444
  • Inserito solo l’intestazione alla lettura del primo file
  • Rimosso la riga vuota che stava in ciascun file
  • Inviato email alla mia boss con il file completo.

Okay! Non mi restava che scrivere il codice…ed io non so praticamente niente di Python!!!!

Mi sono messo in mano a Google e sono riuscito a tirar fuori questo:

#Importo le librerie CSV, e OS
import csv

import os
# assegno alla variabile mypath il percorso della cartella dove ho i file che voglio unire
mypath = 'c:\\Folder\\'

# assegno a onlyfiles la lista dei file che si trovano nella cartella mypath
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
# verifico se il file che accoglierà tutti i dati esiste già, nel qual caso lo cancello
if os.path.exists(mypath + "allStock.csv"):
   os.remove(mypath + "allStock.csv")
else:
   print("The file does not exist")
# apro e creo il file allStock.csv
myFileStock = open("allStock.csv","a")

y=0

# scorro la lista dei file nella cartella
for nomeFile in onlyfiles:
# filtro per i soli file con estensione .csv
    if nomeFile[-4:] == '.csv':
# il nome del file contiene la data e l'ora nel quale è stato creato, in questo caso recupero dal nome le varie parti che mi permettono di ricostruire la data nel formato DD/MM/YYYY
        dateExport = nomeFile[19:21] + '/' + nomeFile[17:19] + '/'+ nomeFile[13:17]
#con lo stesso concetto recupero anche l'ora nel quale il file è stato creato
        dateHour = nomeFile[21:23]
        print(dateExport)
#apro il file in lettura
        with open(mypath+nomeFile,'r') as fileinput:
            i = 0
# inizio a leggere il contenuto
            for row in fileinput:
                if i == 0:
                    if y == 0:
# utilizzo la variabile y a 0 come semaforo in modo da aggiungere solo una volta nel file l'intestazione delle colonne...e ne approfitto per aggiungere le due nuove colonne
                        writerow = 'DATE;HOUR;' + row
# scrivo il nuovo file
                        myFileStock.write(writerow)
                        y = 1
                    else:
                        i = 1
                else:
# se c'è una riga vuota la salto e non la inserisco nel mio file
                    if row != "\n":
# scrivo il nuovo file
                        writerow = dateExport + ";" + dateHour + ";" + row
                        myFileStock.write(writerow)
# chiudo i files utilizzati
fileinput.close()
myFileStock.close()

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *