2010-05-19 14 views
19

Sto provando a controllare il valore dei dati estratti rispetto a un csv che ho già. Una volta, collegherò solo le righe del CSV, posso solo controllare un valore di feed.items(). C'è un valore che devo resettare da qualche parte? C'è un modo migliore/più efficace per fare questo? Grazie.Lettura ripetuta dei CSV in Python?

orig = csv.reader(open("googlel.csv", "rb"), delimiter = ';') 
goodrows = [] 
for feed in gotfeeds:  
    for link,comments in feed.items(): 
     for row in orig: 
      print link 
      if link in row[1]: 
       row.append(comments) 
       goodrows.append(row) 

risposta

27

È possibile "resettare" l'iteratore CSV reimpostando la posizione di lettura del file oggetto.

data = open("googlel.csv", "rb") 
orig = csv.reader(data, delimiter = ';') 
goodrows = [] 
for feed in gotfeeds:  
    for link,comments in feed.items(): 
     data.seek(0) 
     for row in orig: 
      print link 
      if link in row[1]: 
       row.append(comments) 
       goodrows.append(row) 
+0

Funziona alla grande, grazie. Il mio file è piccolo per il prossimo futuro, ma odio dover rintracciare perché è lento in un paio di mesi. – matt

7

Fare orig un elenco evita la necessità di ripristinare/rianalizzare l'csv:

orig = list(csv.reader(open("googlel.csv", "rb"), delimiter = ';')) 
+4

Tecnicamente funzionante, ma l'intero file CSV verrà caricato in memoria. Non è un grosso problema se il file è piccolo, ma questo non si ridimensiona. – Cerin

+0

@ Chris. Vero. Se il file CSV è enorme, mi aspetto che lo menzioni nella domanda, ma c'è sicuramente spazio per entrambe le nostre interpretazioni. – unutbu

+0

Sono d'accordo con Chris S. Abbiamo affrontato lo stesso problema .. alla fine i nostri file CSV hanno ottenuto fino a 5GB un pezzo. Inutile dire che è stato un incubo – dassouki