HOWTO · Python
Converti file CSV in file JSON in Python
Questo tutorial mostra come convertire un file CSV in un file JSON in Python
In questa pagina
Converti un file CSV in JSON con Python leggendo ogni riga e scrivendola nel formato JSON previsto dalla tua applicazione. Usa pandas se fa già parte del tuo flusso di lavoro sui dati; per convertire senza pacchetti di terze parti, usa i moduli integrati csv e json di Python. Il CSV rappresenta dati tabellari, mentre il JSON può contenere un array di oggetti-riga o altre strutture: per questo è importante scegliere il formato di output adatto.
Convertire un file CSV in JSON con pandas
Installa pandas nell’ambiente del progetto se non è già disponibile. read_csv() carica la tabella in un DataFrame e to_json() la serializza. Per ottenere un array di oggetti, imposta orient="records". Con lines=True, invece, viene scritto un oggetto JSON per riga (JSON Lines), formato utile per gli strumenti di elaborazione in streaming ma diverso da un singolo array JSON.
Questo esempio autonomo crea un piccolo file di input, lo converte e poi legge il JSON risultante. Il file di output contiene un array di record, con i nomi originali delle colonne come chiavi.
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd
with TemporaryDirectory() as folder:
source = Path(folder) / "people.csv"
destination = Path(folder) / "people.json"
source.write_text("name,age\nAva,31\nNoah,28\n", encoding="utf-8")
frame = pd.read_csv(source)
frame.to_json(destination, orient="records", indent=2)
records = pd.read_json(destination, orient="records").to_dict(orient="records")
print(records)
L’opzione indent rende il JSON più facile da esaminare; senza di essa, il contenuto serializzato è più compatto. pandas deduce il tipo di molti valori, quindi un campo che sembra numerico può diventare un numero. Controlla il risultato quando una colonna deve restare testo, per esempio un identificativo con zeri iniziali. Se il CSV usa un delimitatore diverso, passalo a read_csv() tramite sep. Specifica esplicitamente la codifica del file quando è diversa da UTF-8.
Convertire un file CSV in JSON con i moduli csv e json di Python
La libreria standard offre una soluzione senza dipendenze aggiuntive. csv.DictReader usa la prima riga del CSV come nomi dei campi e restituisce le righe successive sotto forma di dizionari. L’esempio seguente scrive tutte le righe in un unico array JSON e poi analizza il file salvato per verificare che contenga JSON valido.
Esegui questo esempio:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
from pathlib import Path
from tempfile import TemporaryDirectory
import csv
import json
with TemporaryDirectory() as folder:
source = Path(folder) / "people.csv"
destination = Path(folder) / "people.json"
source.write_text("name,age\nAva,31\nNoah,28\n", encoding="utf-8")
with source.open(newline="", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
with destination.open("w", encoding="utf-8") as json_file:
json.dump(rows, json_file, ensure_ascii=False, indent=2)
parsed = json.loads(destination.read_text(encoding="utf-8"))
print(json.dumps(parsed, ensure_ascii=False, indent=2))
Il file CSV viene aperto con newline="", come raccomandato per il modulo csv; specificare la codifica evita che la decodifica del testo dipenda dalla piattaforma. json.dump() scrive un valore Python in un file aperto, mentre json.dumps() restituisce testo JSON: per questo nell’esempio viene usato per mostrare il risultato analizzato. L’opzione ensure_ascii=False mantiene leggibili nel file i caratteri non ASCII. Rimuovila se preferisci le sequenze Unicode con escape.
Per DictReader è importante che il CSV abbia una riga di intestazione: i nomi delle colonne diventano le chiavi degli oggetti JSON. Se il file non ha intestazione, fornisci fieldnames quando crei il lettore oppure leggi le righe come liste e definisci tu la corrispondenza tra campi e valori. Per un file delimitato da punto e virgola, usa csv.DictReader(csv_file, delimiter=";"). La libreria standard legge ogni campo come testo; converti i campi in modo esplicito se chi consumerà i dati ha bisogno di numeri o valori booleani.
Scegliere la struttura JSON e gestire i valori CSV
Un array di oggetti è una scelta comune per le API e il codice delle applicazioni: ogni riga diventa un oggetto le cui chiavi provengono dall’intestazione del CSV. Con pandas si ottiene questo formato usando orient="records"; l’esempio con la libreria standard scrive una lista di dizionari. In questo modo ogni riga resta unita e l’indice della riga non viene aggiunto come campo separato.
Con JSON Lines, invece di racchiudere tutti i record in un array, serializza un record per riga. Con pandas usa orient="records", lines=True. Con la libreria standard, scrivi ogni riga con json.dumps(row) e aggiungi un carattere di nuova riga. JSON Lines è utile quando i record vengono elaborati uno alla volta, ma un programma che si aspetta un unico documento JSON potrebbe rifiutarlo. Scegli il formato previsto dal programma che riceverà i dati.
Il CSV non ha un sistema di tipi universale. DictReader restituisce stringhe, anche per valori come "31"; il JSON li conserva come stringhe a meno che il programma non li converta. pandas può dedurre numeri e altri tipi quando carica i dati. Decidi in base al significato di ogni colonna: per esempio, conserva come stringhe i codici postali e gli identificativi, ma converti una quantità in un numero intero se devi eseguire calcoli. Anche le celle vuote richiedono una scelta esplicita: puoi mantenerle come stringhe vuote, convertirle in None (che diventa null nel JSON) oppure usare un’opzione di pandas per i valori mancanti adatta ai tuoi dati. Non dare per scontato che tutte le celle vuote abbiano lo stesso significato.
Mantieni i nomi delle colonne stabili e univoci. Un’intestazione mancante, un delimitatore inatteso o una codifica diversa possono spostare o alterare i valori. Se i campi possono contenere virgole o interruzioni di riga, assicurati che la sorgente rispetti le regole di quoting del CSV e lascia che sia il parser CSV a gestirli: non dividere le righe manualmente.
Verificare e risolvere i problemi dell’output JSON
Dopo aver scritto l’output, analizzalo se deve essere usato da un altro programma. json.load() verifica un file JSON completo e restituisce il valore Python corrispondente; json.loads() fa lo stesso con una stringa. L’esempio con la libreria standard analizza il file salvato prima di mostrarlo. Per JSON Lines, analizza separatamente ogni riga non vuota, perché il file completo non è un unico array o oggetto JSON.
Se l’analisi non riesce, controlla che l’output sia stato scritto come un unico valore JSON valido, che il file non sia stato troncato e che il JSON sia stato prodotto con json.dump() o json.dumps(), anziché concatenando valori manualmente. Se il contenuto è valido ma i valori non sono corretti, verifica il delimitatore, la riga di intestazione, la codifica, il quoting e le conversioni dei tipi applicate all’input. Se l’output presenta annidamenti inattesi o un campo per l’indice, controlla l’opzione pandas orient selezionata: records è il formato con oggetti-riga mostrato qui. Infine, confronta il numero di record analizzati con il numero di righe di dati nel CSV: sarà più facile individuare eventuali righe omesse o duplicate.