Próbuję odczytać określone wiersze dużego pliku CSV i nie chcę załadować całego pliku do pamięci. Indeks poszczególnych wierszach podane są na liście L = [2, 5, 15, 98, ...]
i mój plik CSV wygląda tak:Jak odczytywać określone wiersze dużego pliku csv
Col 1, Col 2, Col3
row11, row12, row13
row21, row22, row23
row31, row32, row33
...
Korzystanie pomysły wymienione here używam następujące polecenie, aby przeczytać wiersze
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]
razu Pojawia się następujący błąd:
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
Pytanie 1. wydaje się moim użytkowania for
pętle tutaj jest oczywiście błędne. Wszelkie pomysły, jak to naprawić?
Z drugiej strony, co następuje dostaje zadanie, ale jest zbyt powolny:
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)
Pytanie 2. Każdy pomysł, jak poprawić tę podstawową metodę przeżywa całego pliku, dopóki nie dotrzeć do rzędu, a następnie wydrukować?
Dzięki, w końcu skończyłem robić coś podobnego do tego. Połów był taki, że moja lista L została już zamówiona i nie musiałem za każdym razem sprawdzać członkostwa. Sprawdziłem tylko, czy 'i == L [0]', a następnie pominąłem pierwszy wpis 'L'. Aby uniknąć czytania cały plik @vlad podał rozwiązanie, powyżej. – Keivan