[PIPython] lettura file da un punto scelto

Alex Martelli aleaxit
Ven 19 Nov 2004 15:16:40 CET


On Monday 05 January 2004 10:47 am, nicgios wrote:
> Cari tutti,
>
> sono un nuovo arrivato e sto imparando il Python con
> grande soddisfazione personale (non so fare molto, ma davvero lo
> trovo uno spasso... :). Scrivo perche' ho una domanda (stupida):
> per leggere un file di testo riga per riga uso .readline().
> Tuttavia il buon .readline() parte sempre dall'inizio del file
> (quindi dalla prima riga): c'è modo di farlo partire da un punto
> qualsiasi in mezzo al file, in modo da fargli leggere porzioni di testo?
> Immagino che il tutto sia perfettamente documentato, ma non sono riuscito
> a trovare questa informazione.

Supponendo che f sia l'oggetto-file che stai leggendo, se esegui
un comando come f.seek(943) la lettura successiva partira` dal
byte numero 943 nel file.  Naturalmente, nulla di piu` facile che
questo punto sia nel bel mezzo di una riga, nel qual caso la prossima
readline ti tornera` la "mezza riga finale".  Inoltre, la numerazione di
byte e` problematica per file di testo in sistemi che usano DUE byte,
invece di uno, come terminatore di riga (in pratica solo Windows),
visto che i due byte vanno trasformati in uno solo (il fineriga \n) ma
questo non puo` essere fatto senza LEGGERE i dati ("saltarli" come
fa .seek non permette di verificare e trasformare i fine-riga), quindi
non e` detto che il risultato sia esattamente quel che ti aspetti.

Se un file di testo ha dimensioni "decenti" (cioe` non cosi` enormi
da superare la RAM fisica a disposizione; su di un tipico PC di oggi,
sino a qualche centinaio di megabyte sei a posto), leggere tutte le
righe in una lista di stringhe con una singola chiamata a .readlines
(nota la s finale!) ti permette poi di "passeggiare" agevolmente
avanti e indietro sulla lista senza problemi.  In pratica, quindi, i vari
problemi connessi al non voler _leggere_ i dati ma solo saltarli si
presentano solo nei rari programmi che devono essere pronti a
trattare, con prestazioni comunque decenti, segmenti di file di testo
enormi, file di testo grossi centinaia di megabyte.  Considerando
ad esempio che l'intero testo della Bibbia (vecchio e nuovo testamento,
versione inglese "King James") e` 4.4 milioni di byte (compresi vari
byte per versetto usati per indicare libro e numero), possiamo pensare
che i file di testo che sono molte decine di volte piu` grossi non siano
poi moltissimi.


Alex




More information about the Python mailing list