对于一个项目,如果下一行的某一列中的值等于当前行的同一列中的值,我需要签入一个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)我进入循环;row=row1
(2) 当前行=行1,下一行=行2
(3) 我进入循环的下一个迭代;row=row3,因为我使用了__next__()
。当前行=第3行,下一行=第4行
在这个例子中,我永远不会检查row2 == row3
。在
是否可以在不迭代迭代器对象的情况下检查下一行的值?
或者,是否存在与__next__()
相反的方法,使迭代器返回一步?在
请注意:我正在比较当前值与下一个值而不是当前值与上一个值,因为我不知道我正在读的文件有多长。我必须将文件的最后一行与其他行不同,因此我必须检查reader.__next()__
以查看是否有最后一行。在
试试
itertools
pairwise
配方。一个更一般的解决方案是tee
您的迭代器(这是成对配方使用的)。另一种可能是创建一个具有cur和next变量并生成所需值的函数(基本上是pairwise所做的,但是您可以让它生成CSV中的字段,而不是整行)。在来自https://docs.python.org/2/library/itertools.html
我认为pairwise可以在这里完成您需要的一切,所以不要操心您自己的生成器函数或
^{pr2}$tee
。在请注意,如果您有一个iterable,其中有
n
项,那么将有n-1
项成对出现。在我不知道这是否可行,但它在android上有效
您的需求和内置迭代器的思想相冲突。所以我建议您将循环封装在自定义迭代器中。 其思想是从原始迭代器中生成两个值,对于最后一行的下一个值没有值。在
相关问题 更多 >
编程相关推荐