首页 > 解决方案 > 使用上一行和当前行比较进行迭代时出现问题跳过行

问题描述

我有一个排序数据列表,以便列表中的每个项目都是要写入文件的 csv 行。

脚本的最后一步检查每个字段的内容,如果除最后一个字段之外的所有字段都匹配,则它将当前行的最后一个字段复制到前一行的最后一个字段。

我想,因为我已经找到并处理了其中一个匹配项,所以跳过了从中复制字段的当前行,因此只留下其中一行。

这是一组示例数据

field1,field2,field3,field4,something
field1,field2,field3,field4,else

期望的输出

field1,field2,field3,field4,something else

这是我到目前为止所拥有的

output_csv = ['field1,field2,field3,field4,something',
              'field1,field2,field3,field4,else']

# run through the output
# open and create a csv file to save output
with open('output_table.csv', 'w') as f:

    previous_line = None
    part_duplicate_line = None
    part_duplicate_flag = False

    for line in output_csv:
        part_duplicate_flag = False

        if previous_line is not None:                    
            previous = previous_line.split(',')
            current = line.split(',')

            if (previous[0] == current[0] 
                and previous[1] == current[1]
                and previous[2] == current[2]
                and previous[3] == current[3]):
                print(previous[0], current[0])
                previous[4] = previous[4].replace('\n', '') + ' ' + current[4]
                part_duplicate_line = ','.join(previous)
                part_duplicate_flag = True
                f.write(part_duplicate_line)

            if part_duplicate_flag is False:
                f.write(previous_line)

        previous_line = line

ATM 脚本添加了该行但不跳过下一行,在将 part_duplicate_line 写入文件后,我尝试了 continue 语句的各种演绎,但无济于事。

标签: pythonloopscsv

解决方案


我建议将您想要做的事情封装在一个重要部分遵循此逻辑的函数中:

要么new信息old记录
,要么输出old记录并忘记它

当然,在循环结束时,无论如何我们都有一个悬空old记录要输出

def join(inp_fname, out_fname):
    '''Input file contains sorted records, when two (or more) records differ
only in the last field, we join the last fields with a space
and output only once, otherwise output the record as-is.'''
    ######################### Prepare for action ##########################
    from csv import reader, writer
    with open(inp_fname) as finp, open(out_fname, 'w') as fout:
        r, w = reader(finp), writer(fout)
        ######################### Important Part starts here ############## 
        old = next(r)
        for new in r:
            if old[:-1] == new[:-1]:
                old[-1] += ' '+new[-1]
            else:
                w.writerow(old)
                old = new
        w.writerow(old)

要检查我的建议,您可以使用这两个片段(请注意,这些记录比您的要短,但这是一个示例,并不重要,因为我们仅-1用于索引我们的记录)。

第一个有一个“常规”的最后记录

open('a0.csv', 'w').write('1,1,2\n1,1,3\n1,2,0\n1,3,1\n1,3,2\n3,3,0\n')
join('a0.csv', 'a1.csv')

而第二个有最后一条记录,必须与前一条记录相连。

open('b0.csv', 'w').write('1,1,2\n1,1,3\n1,2,0\n1,3,1\n1,3,2\n')
join('b0.csv', 'b1.csv')

如果您像我在发布之前所做的那样运行片段,在您定义的环境中,join您应该得到您想要的。


推荐阅读