Ho creato la seguente funzione per estrarre i dati da un file. Funziona bene, ma diventa molto lento per i file più grandi.Ottieni dati da un file senza itarlo attraverso più volte
def get_data(file, indexes, data_start, sieve_first = is_float):
file_list = list(file)
for i in indexes:
d_line = i+data_start
for line in file_list[d_line:]:
if sieve_first(line.strip().split(',')[0]):
yield file_list[d_line].strip()
d_line += 1
else:
break
def is_float(f):
try:
float(str(f))
except:
return False
else:
return True
with open('my_data') as f:
data = get_data(f, index_list, 3)
Il file potrebbe assomigliare a questo (i numeri di riga aggiunte per chiarezza):
line 1234567: # <-- INDEX
line 1234568: # +1
line 1234569: # +2
line 1234570: 8, 17.0, 23, 6487.6
line 1234571: 8, 17.0, 23, 6487.6
line 1234572: 8, 17.0, 23, 6487.6
line 1234572:
line 1234572:
line 1234572:
Con l'esempio precedente, le linee 1.234.570 1.234.572 attraverso verranno ceduti.
Poiché i miei file sono grandi, ci sono un paio di cose che non mi piacciono della mia funzione.
- Il primo è che legge l'intero file in memoria; Lo faccio in modo da poter utilizzare l'indicizzazione di riga per analizzare i dati.
- Il secondo è che le stesse righe nel file vengono ripetute più volte - questo diventa molto costoso per un file di grandi dimensioni.
Mi sono messo a trafficare cercando di utilizzare gli iteratori per passare il file una volta sola, ma non sono riuscito a decifrarlo. Eventuali suggerimenti?
Basta fare 'per line in file' invece di' list (file) ' –
@ cricket_007 grazie, ma se' file' non supporta l'indicizzazione, il resto della funzione non funzionerebbe. –
Se il file non supporta l'indicizzazione, allora come stai 'file [d_line:]'? –