Sto scrivendo uno script per elaborare file EDI X12, che vorrei ripetere riga per riga. I file sono composti da una sequenza di record distinti, ciascuno terminato da un carattere speciale (ad esempio ~
, ma vedere di seguito). I file possono essere di grandi dimensioni (> 100 MB), quindi non voglio leggere tutto e dividerlo. I record non sono separati da una nuova riga; leggere nella prima riga probabilmente leggerebbe l'intero file. I file sono tutti-ASCII.Leggi file fino a un carattere
Python prevede chiaramente la lettura di un file fino a un determinato carattere, purché tale carattere sia una nuova riga. Mi piacerebbe fare la stessa cosa con un personaggio arbitrario. Presumo che la lettura per riga sia implementata tramite buffering. Potrei implementare il mio lettore bufferizzato, ma preferirei evitare il codice extra e il sovraccarico se esiste una soluzione migliore.
Nota: ho visto alcune domande simili, ma sembravano tutti concludere che si dovrebbe leggere il file nella riga, presumendo che le linee sarebbero di dimensioni ragionevoli. In questo caso, l'intero file sarà probabilmente una riga.
Modifica: il carattere di terminazione del segmento è qualunque sia il 106 ° byte del file. Non è noto prima che lo script venga invocato.
Forse usate '.read (some_reasonable_number)' sul puntatore del file e cercate il risultato fino a trovare '~', e se lo fate, '.seek()' indietro? – L3viathan
Credo che tu abbia ragione riguardo al lettore bufferizzato, e sfortunatamente l'argomento 'newline' in' open' non consente '~'. –
Temo che dovrai scrivere un'implementazione dedicata su un io.BytesIO, leggendo il file in blocchi e inviando indietro * line * terminato con il tuo particolare delimitatore ... –