Чтение.csv в Python без цикла через весь файл?
единственный способ, которым я видел csv Python.читатель используется в цикле for, который проходит через весь файл без сохранения прошлых значений переменных read in. Мне нужно работать только с 2 последовательными строками (огромного) файла за раз. С помощью КШМ.читатель для цикла, у меня есть только 1 строка за раз.
есть ли способ использовать csv-модуль Python для приема только одной строки csv-файла без необходимости заканчивать чтение файла до конца?
Мне нужно установить переменные для значений в первой строке, установите второй набор переменных для значений следующей строки, используйте два набора переменных одновременно для вычислений, затем перезапишите первый набор переменных вторым набором и прочитайте новую строку для перезаписи второго набора.
5 ответов
ничто не заставляет вас использовать читателя в цикле. Просто прочтите первую строку, затем вторую.
import csv
rdr = csv.reader(open("data.csv"))
line1 = rdr.next() # in Python 2, or next(rdr) in Python 3
line2 = rdr.next()
Если вы всегда смотрите ровно на две последовательные строки, Мне кажется, что вы можете извлечь выгоду из использования попарно рецепт. От 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
читать CSV:
readCSV = csv.reader(csvFile, delimiter=',')
Читать следующую строку в Python 2.7:
row = readCSV.next()
Читать следующую строку в Python 3.4:
row = readCSV.__next__()
очевидным ответом, по-видимому, является просто сохранение предыдущей строки на каждой итерации.
>>> for x in csv.DictReader(stream):
... print prevLine
... print x
... prevLine = x
....
вопиющее воровство из TK... ...в основном остается вопрос, что OP хочет сделать с первой и последней строками файла?
prevLine = None
for x in csv.DictReader(stream):
if prevLine is not None:
DoWork(prevLine, x)
else:
Initialize(x)
prevLine = x
Finalize(prevLine)