2014-12-08 9 views
5

Tak więc mam po prostu bardzo długą listę ciągów i plik CSV, który zawiera kolumnę ciągów i kolumnę liczb. Muszę przejrzeć bardzo długą listę ciągów, a dla każdego przepętrzyć wiersze pliku CSV sprawdzając każdy ciąg w pierwszej kolumnie pliku CSV, aby zobaczyć, czy występuje on w moim ciągu, a jeśli tak, to dodać numer w drugiej kolumnie do czegoś. Minimalna rodzaju przykład byłobyPotrafię tylko raz przechodzić przez czytnik CSV.

import csv 
sList = ['a cat', 'great wall', 'mediocre wall'] 
vals = [] 
with open('file.csv', 'r') as f: 
    r = csv.reader(f) 
    for w in sList: 
     val = 0 
     for row in r: 
      if row[0] in w: 
       val += 1 
     vals.append(val) 

Przykład CSV złożyć, które mogą korzystać z tego może być

a, 1 
great, 2 

oczywiście csv.reader (F) wytwarza Iterable że można pętli tylko raz. Widziałem rekomendacje gdzie indziej używać itertools, ale wszystkie zalecenia, które znalazłem, dotyczyły problemów polegających na zapętleniu pliku CSV kilka razy, zwykle zaledwie dwa razy. Gdybym próbował użyć tego do wielokrotnego przechodzenia przez CSV, nie jestem pewien, co oznaczałoby zużycie pamięci, i ogólnie zastanawiam się nad najmądrzejszym sposobem rozwiązania tego problemu.

+0

Jak duży jest plik? Czy możesz po prostu przeczytać całą rzecz w słowniku i wykonać swoje wyszukiwania względem wynikowego słownika? –

Odpowiedz

7

Trzeba "reset" iteracyjnej pliku:

import csv 
sList = ['a cat', 'great wall', 'mediocre wall'] 
vals = [] 
with open('data.csv', 'r') as f: 
    r = csv.reader(f) 
    for w in sList: 
     val = 0 
     f.seek(0) #<-- set the iterator to beginning of the input file 
     for row in r: 
      print(row) 
      if row[0] in w: 
       val += 1 
     vals.append(val) 
+0

Interesujące, spróbuję tego - ale czy na pewno ustawiam f.seek (0) zamiast r.seek (0)? Właśnie sprawdzam, dziękuję za pomoc! – Addem

+1

@Addem. Jestem pewien, przetestowałem to przed wysłaniem na pythona 3.4. – Marcin