python - 使用上一行和当前行比较进行迭代时出现问题跳过行
问题描述
我有一个排序数据列表,以便列表中的每个项目都是要写入文件的 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 语句的各种演绎,但无济于事。
解决方案
我建议将您想要做的事情封装在一个重要部分遵循此逻辑的函数中:
要么将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
您应该得到您想要的。
推荐阅读
- postgresql - 在 pg_restore 期间以自定义格式 (-F c) 备份 PostgreSQL 失败(日志中的复制命令)
- node.js - 提高流视频帧性能的方法
- bash - 在 Windows 上开发但在 UNIX docker 容器上运行时出现行尾问题
- java - 有多个子类时如何设计Restful服务请求?
- roblox - 根据玩家是否在区域内打开和关闭 GUI
- java - Spring Boot 中的默认 ORM 提供程序是什么(使用 Spring Data JPA 时)?
- android - 活动以某种方式起作用但不可见
- kubernetes - Kubernetes - 如何计算每个容器所需的资源?
- c - 为什么这个函数是非法的?
- google-cloud-platform - Cloud Endpoint 和 API Gateway (GCP) 是否支持 Websocket?