2010-07-09 18 views

risposta

4

Devi solo analizzare tutto il file CSV, quindi utilizzare l'indicizzazione di sequenziamento normale.

In caso contrario, si può fare qualcosa di simile

def my_filter(csv_file, lines): 
    for line_number, line in enumerate(csv_file): 
     if line_number in lines: 
      yield line 

my_file = open("file.csv") 
my_reader = csv.reader(my_filter(my_file, (3,))) 

Si noti che non è possibile evitare l'analisi l'intero file, in un modo o in un altro, perché le linee sono di lunghezza variabile. Il conteggio delle righe avanza solo quando viene trovato un '\ n' e deve essere trovato in carattere carattere per carattere.

Inoltre, questo filtro non funzionerà se si dispone di caratteri di nuova riga all'interno di virgolette nel file csv - probabilmente è meglio analizzare l'intero file in un elenco e recuperare gli indici da lì, comunque:

my_file = open("file.csv") 
my_reader = csv.reader(my_file) 
my_line = list(my_reader)[3] 

aggiornamento più importante: se avete bisogno di accesso casuale ai dati, che è troppo grande per entrare nella memoria, basti pensare dumping a un database SQL, invece. Ne risparmierà uno reinventando molte ruote.

+0

di sicuro. il file è di gran lunga troppo grande per poter leggere l'intera cosa in memoria in una sola volta. Ho in programma di accedere a tutte le linee, ma ho anche bisogno di saltare il file e evitare di caricare tutto in una volta. – ahhh

+0

COSÌ, la soluzione di filtro ti aiuterà - (a patto di non avere \ n all'interno dei valori letterali). Per l'accesso fuori servizio, la soluzione filtro può essere utilizzata per creare un elenco come nell'ultimo esempio. – jsbueno

Problemi correlati