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()