2010-07-09 17 views

Odpowiedz

4

Musisz tylko przeanalizować cały plik CSV, a następnie użyć normalnego indeksowania sekwencyjnego.

przeciwnym razie można zrobić coś takiego

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,))) 

pamiętać, że nie można uniknąć analizowania całego pliku, w sposób lub w innym, ponieważ linie są o zmiennej długości. Liczba linii rośnie tylko wtedy, gdy "\ n" jest znalezione i musi być znalezione w postaci znak po znaku.

Filtr ten nie będzie działał, jeśli w cudzysłowie w pliku csv pojawią się znaki nowego wiersza. Prawdopodobnie lepiej jest przetworzyć cały plik na listę i pobrać z niego indeksy:

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

aktualizacja Najważniejsze: jeśli potrzebna jest swobodny dostęp do informacji, które są zbyt duże, aby zmieścić się w pamięci, po prostu uważają dumpingu go do bazy danych SQL zamiast. Oszczędnie, jeśli wymyślimy wiele kół.

+0

na pewno. plik jest o wiele za duży, żeby od razu przeczytać całość w pamięci. Planuję uzyskać dostęp do wszystkich linii, ale także trzeba przeskakiwać plik i unikać ładowania całego obiektu na raz. – ahhh

+0

SO, rozwiązanie filtrujące pomoże ci - (o ile nie masz wewnętrznych wartości literowych \ n). Jeśli potrzebujesz dostępu do zlecenia, możesz użyć rozwiązania filtrującego do utworzenia listy, jak w ostatnim przykładzie. – jsbueno

Powiązane problemy