2010-06-23 20 views
26

L'unico modo in cui ho visto csv.reader di Python utilizzato è in un ciclo for, che passa attraverso l'intero file senza salvare i valori passati delle variabili read in. Ho solo bisogno di lavorare con 2 file consecutive del (enorme) file alla volta. Usando il csv.reader per loop, ho solo 1 linea alla volta.Leggere .csv in Python senza eseguire il loop dell'intero file?

C'è un modo per usare il modulo csv di Python per prendere solo una riga di un file csv senza dover finire di leggere il file fino alla fine?

Devo impostare le variabili sui valori nella prima riga, impostare un secondo set di variabili sui valori della riga successiva, utilizzare simultaneamente i due insiemi di variabili per i calcoli, quindi sovrascrivere il primo insieme di variabili con il secondo set, e leggere una nuova riga per sovrascrivere il secondo set.

+1

non è possibile memorizzare il primo set? – SilentGhost

+0

Non capisco la domanda. Mi stai chiedendo se sono in grado di memorizzare la prima riga in variabili? – mary

+0

sì, cosa ti impedisce di memorizzare la prima linea fino a quando arriva la seconda, quindi usando entrambi? – SilentGhost

risposta

40

Non c'è niente che ti costringa a utilizzare il lettore in un ciclo. Basta leggere la prima riga, quindi leggere la seconda riga.

import csv 
rdr = csv.reader(open("data.csv")) 
line1 = rdr.next() # in Python 2, or next(rdr) in Python 3 
line2 = rdr.next() 
+0

Molto utile, grazie. Il modo in cui divideva la linea in colonne era: r = csv.reader (aperto ("data.csv")) per col1, col2, col3 in r: x = float (col1) y = etc ... Come devo adattare tale metodo usando r.next() invece di un ciclo for? In altre parole, come estrarre le voci della colonna dall'intera riga? – mary

+1

@mary: nel mio esempio, la riga1 è solo una lista in modo che la riga1 [0] sia la prima colonna, riga1 [1] la seconda colonna, ecc. Se vuoi, puoi fare qualcosa come '(col1, col2, col3) = line1' –

+0

In Python 3, usa la funzione built-in 'next (r)' invece del metodo 'r.next()'. – smci

2

La risposta ovvia sembra essere quella di memorizzare la riga precedente su ogni iterazione.

>>> for x in csv.DictReader(stream): 
... print prevLine 
... print x 
... prevLine = x 
.... 
+2

@TK: questo codice, così com'è, non funzionerà poiché non si inizializza la prevLine. –

3

Blatant rubare da TK ... ... per lo più la domanda che rimane è, cosa vuole fare l'OP con la prima e l'ultima riga del file?

prevLine = None 

for x in csv.DictReader(stream): 
    if prevLine is not None: 
     DoWork(prevLine, x) 
    else: 
     Initialize(x) 
    prevLine = x 

Finalize(prevLine) 
+0

Ogni riga contiene posizioni, quindi ho bisogno di calcolare le velocità tra di loro e animare un oggetto che viaggia da uno all'altro. Quando l'ultima posizione viene colpita dall'oggetto, il programma termina. – mary

+0

La risposta a questa domanda dovrebbe informare quindi cosa devi fare con i dati. O tratti la prima e l'ultima riga in modo speciale (come ho fatto io), oppure devi in ​​qualche modo occuparti di "vuoto" precedente o successivo alle estremità. –

4

Se stai sempre guardando esattamente due righe consecutive, suona per me come si potrebbe trarre vantaggio dall'utilizzo della coppie recipe. Dal modulo itertools:

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

si può usare questa in questo modo:

for first_dict, second_dict in pairwise(csv.DictReader(stream)): 
    # do stuff with first_dict and second_dict 
4

Leggi CSV:

readCSV = csv.reader(csvFile, delimiter=',') 

Leggere la riga successiva in Python 2.7:

row = readCSV.next() 

Leggi la riga successiva in Python 3.4:

row = readCSV.__next__() 
+8

Suggerirei di usare 'row = next (readCSV)'. Questo funziona sia in Python 2.7 e 3, e non fa altro che chiamare i metodi che descrivi. – PeterE

Problemi correlati