2010-06-23 21 views
26

La única forma en que he visto usar el csv.reader de Python es en un bucle for, que recorre todo el archivo sin guardar los valores pasados ​​de las variables de lectura. Solo necesito trabajar con 2 líneas consecutivas del (enorme) archivo a la vez. Utilizando csv.reader for loop, solo tengo 1 línea a la vez.¿Lectura de .csv en Python sin recorrer todo el archivo?

¿Hay alguna manera de usar el módulo csv de Python para tomar solo una línea de un archivo csv sin tener que terminar de leer el archivo hasta el final?

Necesito establecer las variables a los valores en la primera línea, establecer un segundo conjunto de variables para los valores de la siguiente línea, usar los dos conjuntos de variables simultáneamente para los cálculos, luego sobrescribir el primer conjunto de variables con el segundo conjunto, y lea una nueva línea para sobrescribir el segundo conjunto.

+1

¿no puedes guardar el primer conjunto? – SilentGhost

+0

No entiendo la pregunta. ¿Estás preguntando si puedo almacenar la primera línea en variables? – mary

+0

sí, ¿qué le impide almacenar la primera línea hasta que llegue la segunda y luego usar ambas? – SilentGhost

Respuesta

40

No hay nada que obligue a usar el lector en un bucle. Solo lea la primera línea, luego lea la segunda línea.

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

Muy útil, gracias. La forma en que estaba dividiendo la línea en sus columnas fue: r = csv.reader (abierta ("data.csv")) para col1, col2, col3 en r: x = flotador (col1) y = etc ... ¿Cómo debo adaptar ese método usando r.next() en lugar de un ciclo for? En otras palabras, ¿cómo extraigo las entradas de columna de toda la línea? – mary

+1

@mary: en mi ejemplo, la línea 1 es solo una lista, por lo que line1 [0] sería la primera columna, line1 [1] la segunda columna, etc. Si lo desea, podría hacer algo como '(col1, col2, col3) = line1' –

+0

En Python 3, use 'next (r)' función incorporada en lugar del método 'r.next()'. – smci

2

La respuesta obvia parece ser simplemente almacenar la línea anterior en cada iteración.

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

@TK: este código, tal como está, fallará ya que no inicializa prevLine. –

3

Blatant stealing from TK ... ... principalmente la pregunta que queda es, ¿qué quiere hacer el OP con la primera y la última línea del archivo?

prevLine = None 

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

Finalize(prevLine) 
+0

Cada línea contiene posiciones, luego necesito calcular las velocidades entre ellas y animar un objeto que viaja de una a la siguiente. Una vez que el objeto alcanza la última posición, el programa finaliza. – mary

+0

La respuesta a esa pregunta debe informar lo que debe hacer con los datos en ese momento. Ya sea que trate la primera y la última línea especialmente (como lo he hecho), o necesita tratar de alguna manera las líneas anteriores o siguientes "vacías" en los extremos. –

4

Si siempre está buscando en exactamente dos líneas consecutivas, me suena como que podría beneficiarse del uso de la recipe por pares. Desde el módulo de 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) 

puede utilizar esta así:

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

Leer CSV:

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

leer la siguiente fila en Python 2.7:

row = readCSV.next() 

Lea la siguiente fila en Python 3.4:

row = readCSV.__next__() 
+8

Yo recomendaría usar 'row = next (readCSV)'. Esto funciona en python 2.7 y 3, y no hace nada más que llamar a los métodos que describes. – PeterE