HOWTO · Python
Scrivi array su file CSV in Python
Questo tutorial mostra come salvare l'array in un file CSV in Python
In questa pagina
CSV (comma-separated values, valori separati da virgole) memorizza i dati tabellari come righe di testo, quindi è utile per condividere array elaborati con fogli di calcolo e altri programmi. Scegli NumPy per i dati strutturati come array, Pandas se lavori già con un DataFrame e il modulo csv di Python per gestire righe generiche e applicare correttamente le regole di quoting. Gli esempi seguenti usano la virgola come delimitatore e mostrano come leggere le righe risultanti.
Scrivere un array NumPy in un CSV con numpy.savetxt()
numpy.savetxt() scrive array monodimensionali o bidimensionali in un file di testo. Passa delimiter="," per separare le colonne con virgole: il delimitatore predefinito è uno spazio, che non crea colonne separate da virgole. Per un array numerico monodimensionale, usa np.savetxt("numbers.csv", data, delimiter=",", fmt="%d") se è adatta una rappresentazione testuale intera. Per i valori decimali, scegli un formato come "%.2f" per controllare la precisione visualizzata.
Per dati tabellari che combinano testo e numeri, crea un array bidimensionale, ad esempio np.array([["Name", "Age"], ["Ada", 36]]), e passa fmt="%s". Gli array NumPy hanno un solo tipo per tutti gli elementi, quindi combinando testo e numeri si ottengono valori di tipo stringa; il formato li scrive come testo. Il CSV non conserva i tipi di Python o NumPy. Se il programma che legge il file ha bisogno di un intero, deve interpretare valori come 36.
NumPy scrive ogni riga dell’array come una riga del CSV. Non aggiunge nomi di colonna a meno che tu non fornisca un header; per impostazione predefinita, un’intestazione fornita viene preceduta da un marcatore di commento. Per usare una normale prima riga con i nomi delle colonne, imposta header="Name,Age" e comments="".
Scrivere un array in CSV con Pandas DataFrame.to_csv()
Converti dati simili a un array in un DataFrame Pandas se vuoi colonne con etichette o usi già Pandas. Per esempio, df = pd.DataFrame(data, columns=["Name", "Age"]) assegna nomi alle colonne e df.to_csv("people.csv", index=False) le scrive nel file. L’opzione index=False impedisce a Pandas di aggiungere le etichette delle righe come prima colonna; omettila solo se vuoi includere quelle etichette nel file. Imposta header=False se la destinazione non deve contenere i nomi delle colonne. Consulta il riferimento a DataFrame.to_csv() per conoscere le altre opzioni di esportazione.
Scrivere righe in CSV con csv.writer() di Python
Il modulo csv.writer() della libreria standard di Python è una buona scelta generale per righe che contengono testo, numeri, virgole o virgolette. Apri il file con newline="", crea un writer e passagli le righe con writerows(). Il writer applica il quoting CSV quando un valore contiene una virgola o una virgoletta. Questo esempio usa solo la libreria standard e stampa il contenuto del file salvato, così puoi vedere come vengono rappresentate le righe e i delimitatori:
Esegui questo esempio:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
import csv
from pathlib import Path
from tempfile import TemporaryDirectory
rows = [[1, 4, 2], [7, 9, 4], [0, 6, 2]]
with TemporaryDirectory() as directory:
path = Path(directory) / "numbers.csv"
with path.open("w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(rows)
print(path.read_text(encoding="utf-8"), end="")
1,4,2
7,9,4
0,6,2
Per input di grandi dimensioni, writerows() accetta un iterabile di righe, quindi non è necessario assemblare l’intero dataset in un’altra lista. Il file viene chiuso al termine del blocco with.
Rileggere un file CSV con csv.reader()
csv.reader() legge il file e restituisce ogni riga come una lista di stringhe. È un oggetto di lettura, non di scrittura. Per esempio, una cella scritta come 36 viene letta come stringa "36"; se servono operazioni numeriche, converti il valore con int() o float(). Anche per leggere file CSV di testo, aprili con newline="". Se il file ha un’intestazione, gestisci separatamente la prima riga, ad esempio chiamando next(reader) prima di elaborare le righe di dati. Il reader interpreta anche i delimitatori racchiusi tra virgolette, a differenza di una semplice divisione di ogni riga sulle virgole.
Scrivere righe semplici con la gestione dei file di Python
La scrittura diretta su file è adatta a valori semplici e controllati che non contengono virgole, virgolette o interruzioni di riga. Converti ogni valore in testo, unisci i valori della riga con le virgole e termina la riga con un carattere di nuova riga, ad esempio con file.write(",".join(map(str, row)) + "\n"). Questa è una formattazione manuale del testo, non un serializzatore CSV generico: un nome come "Doe, Jane" verrebbe diviso in due colonne. Per dati arbitrari, usa csv.writer(), che gestisce correttamente quoting e delimitatori. Quando apri un file per scrivere CSV, usa newline=""; se il file conterrà testo non ASCII, scegli una codifica esplicita come UTF-8.