对于一个项目,如果下一行的某一列中的值等于当前行的同一列中的值,我需要 checkin 一个 csv 文件。我正在使用字典 csv 阅读器,即阅读器中的每一行都是一个字典文件。我可以使用列标题作为键来访问特定行的值:row[header] = value
。
我当前代码的精简版本如下所示:
import csv
with open(os.path.abspath(path_to_file), "r") as f:
reader = csv.DictReader(f, dialect='excel')
for row in reader:
current_row = row
next_row = reader.__next__()
if current_row[column] == next_row[column]:
dosomething()
这里的问题当然是我使用 __next__()
跳过下一次迭代,即
(1) 我进入循环;行 = 行 1
(2) current_row = row1, next_row = row2
(3) 我进入循环的下一次迭代; row = row3 因为我使用了 __next__()
。 current_row = row3, next_row = row4
在这个例子中,我永远不会检查 row2 == row3
。
是否可以在不遍历迭代器对象的情况下检查下一行的值?
或者,是否有与 __next__()
相反的方法,它使迭代器后退一步?
请注意:我将当前值与下一个值而不是当前值进行比较到 last 值,因为我不知道我正在阅读的文件有多长。我必须将文件的最后一行与其他行区别对待,所以无论如何我都必须检查 reader.__next()__
以查看是否有最后一行。
最佳答案
试试 itertools
pairwise
方法。一个更通用的解决方案是 tee
你的迭代器(这是成对配方使用的)。另一种可能性是创建一个函数,该函数具有 cur 和 next 变量并产生您想要的值(基本上是 pairwise 所做的,但您可以使它产生 CSV 中的字段而不是整行)。
来自 https://docs.python.org/2/library/itertools.html
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return izip(a, b)
我认为 pairwise 可以做你在这里需要的一切,所以不要对你自己的生成器函数或 tee
大惊小怪。
reader = csv.DictReader(f, dialect='excel')
for current_row, next_row in pairwise(reader):
if current_row[column] == next_row[column]:
dosomething()
请注意,如果您有一个包含 n
项的可迭代对象,那么将有 n-1
项成对出现。
关于 python 3 : Checking next value of an iterator without iterating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32160272/