Python使用for循环对比两个CSV文件序列号并输出符合条件文件名咨询
原有代码问题
- 变量赋值错误:收集两个文件的序列号时都存入了同一个
file_serial_list,file1_serial_list和file2_serial_list全程为空,无法完成配对对比 - 没有存储序列号和文件名的对应关系,对比完成后无法定位到符合条件的文件名
- 按行索引配对的逻辑稳定性差,如果两个CSV的文件行顺序不一致,会出现匹配错误
优化实现代码
以下实现保留for循环逻辑,同时兼容两个CSV行顺序不一致的场景:
import csv csv_file1 = r'csv_file.csv' csv_file2 = r'csv_file(1).csv' # 先读取第一个CSV,存为 文件名:序列号 的映射字典 file1_map = {} with open(csv_file1, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: filename = row['filename'].strip() # 若序列号为十六进制格式,需要按数值对比的话可改为存转换后的值:int(row['file_serial_number'].strip(), 16) serial = row['file_serial_number'].strip() file1_map[filename] = serial # 读取第二个CSV逐行对比 with open(csv_file2, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: filename = row['filename'].strip() serial2 = row['file_serial_number'].strip() # 仅对比两个文件共有的同名文件 if filename in file1_map: serial1 = file1_map[filename] if serial1 > serial2: print(filename)
如果你的两个CSV文件行顺序完全一致、且文件名完全一一对应,也可以用逐行zip的方式实现,但上述字典映射的方案兼容性更强,无需依赖行顺序。
输出结果
运行代码即可得到预期输出:
file1 file2
内容的提问来源于stack exchange,提问作者pork_sinigang
相关产品推荐
相关产品推荐

