Gec*_*tar 3 python csv iterator for-loop python-3.x
对于一个项目,如果下一行的某个列中的值等于当前行同一列中的值,我需要检入一个 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()
Run Code Online (Sandbox Code Playgroud)
这里的问题当然是我通过使用跳过了下一次迭代__next__(),即
(1)我进入循环;row = row1 (2) current_row = row1, next_row = row2 (3) 我进入循环的下一次迭代;row = row3 因为我使用了__next__(). current_row = row3, next_row = row4
在这个例子中,我永远不会检查row2 == row3.
是否可以在不迭代迭代器对象的情况下检查下一行的值?或者,是否有相反的方法__next__(),使迭代器后退一步?
请注意:我将当前值与下一个值进行比较,而不是将当前值与最后一个值进行比较,因为我不知道我正在阅读的文件有多长。我必须将文件的最后一行与其他行区别对待,因此reader.__next()__无论如何我都必须检查以查看是否有最后一行。
试试这个itertools pairwise食谱。一个更通用的解决方案是tee你的迭代器(这是成对配方使用的)。另一种可能性是创建一个具有 cur 和 next 变量并产生您想要的值的函数(基本上是成对的,但您可以使其产生 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)
Run Code Online (Sandbox Code Playgroud)
我认为 pairwise 可以在这里完成您需要的一切,因此无需大惊小怪您自己的生成器函数或tee.
reader = csv.DictReader(f, dialect='excel')
for current_row, next_row in pairwise(reader):
if current_row[column] == next_row[column]:
dosomething()
Run Code Online (Sandbox Code Playgroud)
意识到如果你有一个带有n项目的可迭代对象,就会有n-1成对的项目。