Ho scritto una classe che legge un file txt. Il file è composto da blocchi di linee non vuote (chiamiamoli "sezioni"), separati da una riga vuota:generatore python di generatori?
line1.1
line1.2
line1.3
line2.1
line2.2
La mia prima implementazione è stato quello di leggere l'intero file e tornare una lista di liste, che è un elenco di sezioni, in cui ogni sezione è un elenco di righe. Questo era ovviamente terribile in termini di memoria.
Così l'ho ri-implementato come un generatore di liste, cioè ad ogni ciclo la mia classe legge un'intera sezione in memoria come una lista e la produce.
Questo è meglio, ma è ancora problematico in caso di sezioni di grandi dimensioni. Quindi mi chiedo se posso reimplementarlo come un generatore di generatori? Il problema è che questa classe è molto generica e dovrebbe essere in grado di soddisfare entrambi questi casi d'uso:
- leggere un file molto grande, contenente sezioni molto grandi, e scorrere solo una volta. Un generatore di generatori è perfetto per questo.
legge un file piccolo in memoria per essere ripetuto più volte. Un generatore di liste funziona bene, perché l'utente può semplicemente richiamare
lista (MyClass (file_handle))
Tuttavia, un generatore di generatori non avrebbe funzionato nel caso 2, come gli oggetti interni no essere trasformato in liste.
Esiste qualcosa di più elegante dell'implementazione di un metodo to_list() esplicito, che trasformerebbe il generatore di generatori in un elenco di elenchi?
Hai provato a lavorare con readline. In questo modo viene letta solo una linea singola; delimitato da una nuova riga. Questo è un buon modo per caricare piccoli dati nella memoria, a meno che le linee stesse siano enormi. – Vivek
@Vivek Le mie linee sono molto complesse e da ognuna di esse genero un oggetto che convalida la linea e il cui stato dipende anche dalle linee precedenti. L'esposizione della formattazione interna del file all'utente non è un'opzione. – crusaderky
puoi dare una riga di input di esempio ... – Vivek