在Python中读取.csv而不循环遍历整个文件?

时间:2010-06-23 16:01:14

标签: python csv iterator next

我看到Python使用的csv.reader的唯一方法是在for循环中,它遍历整个文件而不保存读取变量的过去值。我只需要一次处理(巨大的)文件的2个连续行。使用csv.reader for循环,我一次只有1行。

有没有办法使用Python的csv模块只接收一行csv文件而不必完成文件的读取?

我需要将变量设置为第一行中的值,将第二组变量设置为下一行的值,同时使用两组变量进行计算,然后用第二行覆盖第一组变量设置,并读取一个新行以覆盖第二组。

5 个答案:

答案 0 :(得分:40)

没有什么可以强迫你在循环中使用阅读器。只需阅读第一行,然后阅读第二行。

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

答案 1 :(得分:5)

如果你总是正好看两条连续的线条,那么听起来就像你可能会因使用成对recipe而受益。来自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

答案 2 :(得分:5)

阅读CSV:

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

阅读Python 2.7中的下一行:

    row = readCSV.next()

阅读Python 3.4中的下一行:

    row = readCSV.__next__()

答案 3 :(得分:4)

显而易见的答案似乎是在每次迭代时只存储上一行。

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

答案 4 :(得分:4)

从传统知识中肆无忌惮地窃取...... ...主要是剩下的问题是,OP想要对文件的第一行和最后一行做什么?

prevLine = None

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

Finalize(prevLine)