Sto cercando di leggere alcune righe specifiche di un file csv di grandi dimensioni e non voglio caricare l'intero file in memoria. L'indice delle righe specifiche saranno riportate in una lista L = [2, 5, 15, 98, ...]
e il mio file CSV è simile al seguente:Come leggere righe specifiche di un file CSV di grandi dimensioni
Col 1, Col 2, Col3
row11, row12, row13
row21, row22, row23
row31, row32, row33
...
Utilizzando le idee menzionate here Io uso il seguente comando per leggere le righe
with open('~/file.csv') as f:
r = csv.DictReader(f) # I need to read it as a dictionary for my purpose
for i in L:
for row in enumerate(r):
print row[i]
ho subito il seguente errore:
IndexError Traceback (most recent call last)
<ipython-input-25-78951a0d4937> in <module>()
6 for i in L:
7 for row in enumerate(r):
----> 8 print row[i]
IndexError: tuple index out of range
domanda 1. sembra che il mio uso delI cicliqui sono ovviamente sbagliati. Qualche idea su come risolvere questo problema?
D'altra parte, il seguente ottiene il lavoro fatto, ma è troppo lento:
def read_csv_line(line_number):
with open("~/file.csv") as f:
r = csv.DictReader(f)
for i, line in enumerate(r):
if i == (line_number - 2):
return line
return None
for i in L:
print read_csv_line(i)
Domanda 2. Qualche idea su come migliorare questo metodo di base di passare attraverso l'intero file fino a quando ho raggiungere la riga quindi stamparlo?
Grazie, alla fine ho finito per fare qualcosa di simile a questo. Il problema è che la mia lista L era già stata ordinata e non avevo davvero bisogno di controllare l'iscrizione ogni volta. Ho solo controllato se 'i == L [0]', e poi ho omesso la prima voce di 'L'. Per evitare di leggere l'intero file @vlad ha fornito una soluzione, sopra. – Keivan