Чтение .csv в Python без перебора всего файла? - PullRequest
27 голосов
/ 23 июня 2010

Единственный способ, которым я видел используемый в Python csv.reader, - это цикл for, который просматривает весь файл без сохранения прошлых значений прочитанных в переменных.Мне нужно работать только с двумя последовательными строками (огромного) файла одновременно.Используя csv.reader для цикла, у меня есть только 1 строка за раз.

Есть ли способ использовать модуль csv Python для получения только одной строки файла csv без необходимости завершать чтение файлаконец?

Мне нужно установить переменные на значения в первой строке, установить второй набор переменных на значения следующей строки, использовать два набора переменных одновременно для вычислений, затем перезаписать первыйнабор переменных со вторым набором и прочитайте новую строку, чтобы перезаписать второй набор.

Ответы [ 5 ]

40 голосов
/ 23 июня 2010

Ничто не заставляет вас использовать ридер в цикле. Просто прочитайте первую строку, затем прочитайте вторую строку.

import csv
rdr = csv.reader(open("data.csv"))
line1 = rdr.next() # in Python 2, or next(rdr) in Python 3
line2 = rdr.next()
5 голосов
/ 15 января 2015

Чтение CSV:

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

Прочитайте следующую строку в Python 2.7:

    row = readCSV.next()

Прочитайте следующую строку в Python 3.4:

    row = readCSV.__next__()
5 голосов
/ 23 июня 2010

Если вы всегда смотрите ровно на две последовательные строки, мне кажется, что вы могли бы выиграть от использования парного рецепта .Из модуля 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)

Вы можете использовать это так:

for first_dict, second_dict in pairwise(csv.DictReader(stream)):
    # do stuff with first_dict and second_dict
4 голосов
/ 23 июня 2010

Откровенное воровство из ТЗ ... ... в основном остается вопрос: что ОП хочет сделать с первой и последней строками файла?

prevLine = None

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

Finalize(prevLine)
4 голосов
/ 23 июня 2010

Очевидный ответ, кажется, заключается в том, чтобы просто хранить предыдущую строку в каждой итерации.

...