web-dev-qa-db-fra.com

Lire .csv en Python sans boucler dans tout le fichier?

La seule façon dont j'ai vu le csv.reader de Python utilisé est dans une boucle for, qui parcourt tout le fichier sans enregistrer les valeurs passées des variables lues. Je n'ai besoin que de travailler avec 2 lignes consécutives du (énorme) fichier à la fois. En utilisant le csv.reader pour la boucle, je n'ai qu'une seule ligne à la fois.

Existe-t-il un moyen d'utiliser le module csv de Python pour prendre une seule ligne d'un fichier csv sans avoir à terminer la lecture du fichier jusqu'à la fin?

Je dois définir des variables sur les valeurs de la première ligne, définir un deuxième ensemble de variables sur les valeurs de la ligne suivante, utiliser les deux ensembles de variables simultanément pour les calculs, puis remplacer le premier ensemble de variables par le deuxième ensemble, et lire une nouvelle ligne pour écraser le deuxième ensemble.

27
mary

Rien ne vous oblige à utiliser le lecteur en boucle. Lisez simplement la première ligne, puis lisez la deuxième ligne.

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

Si vous regardez toujours exactement deux lignes consécutives, il me semble que vous pourriez bénéficier de l'utilisation de la paire recette . Depuis le module 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)

Vous utiliseriez ceci comme ceci:

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

Lire CSV:

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

Lisez la ligne suivante dans Python 2.7:

    row = readCSV.next()

Lisez la ligne suivante dans Python 3.4:

    row = readCSV.__next__()
5
Hatef

Vol de flagrante de savoirs traditionnels ... ... la question qui reste est surtout, qu'est-ce que l'OP veut faire avec les première et dernière lignes du fichier?

prevLine = None

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

Finalize(prevLine)
4
dash-tom-bang

La réponse évidente semble être de simplement stocker la ligne précédente à chaque itération.

>>> for x in csv.DictReader(stream):
...   print prevLine
...   print x
...   prevLine = x
....
4
TK.