Così, come è stato detto in un paio di commenti contenenti i dati in un array è più semplice, ma la soluzione non scala bene in termini di efficienza come i dati aumenta la dimensione. Dovresti davvero usare un iteratore solo quando vuoi accedere a un oggetto casuale nell'array, altrimenti i generatori sono la strada da percorrere. Di seguito ho prototipato una funzione di lettura che legge individualmente ciascun oggetto JSON e restituisce un generatore.
L'idea di base è di segnalare al lettore di dividere il carattere di carrello "\ n" (o "\ r \ n" per Windows). Python può farlo con la funzione .readline().
import json
def json_readr(file):
for line in open(file, mode="r"):
yield json.loads(line)
Tuttavia, questo metodo funziona veramente solo quando il file viene scritto come lo avete - con ogni oggetto separati da un carattere di nuova riga. Di seguito ho scritto un esempio di uno scrittore che separa una serie di oggetti json e li salva su una nuova riga.
def json_writr(file, json_objects):
f = open(file, mode="w")
for jsonobj in json_objects:
jsonstr = json.dumps(jsonobj)
f.write(jsonstr+"\n")
f.flush()
f.close()
Si potrebbe anche fare la stessa operazione con il file .writelines() e di lista
...
jsobjs = [json.dumps(j)+"\n" for j in json_objects]
f.writelines(jsobjs)
...
E se si voleva aggiungere i dati invece di scrivere un nuovo file basta cambiare modalità ' = "w" 'a' mode = "a" '.
Alla fine trovo che questo aiuti molto non solo la leggibilità quando provo ad aprire i file JSON nell'editor di testo, ma anche in termini di utilizzo della memoria in modo più efficiente.
In questa nota, se cambi idea a un certo punto e desideri estrarre una lista dal lettore, Python ti consente di inserire una funzione generatore all'interno di una lista e popolare automaticamente la lista.In altre parole, basta scrivere
lst = list(json_readr(file))
Spero che questo aiuti. Scusa se è stato un po 'prolisso.
avere un singolo array json contenente tutto l'oggetto json sarebbe molto più semplice – njzk2