Python Pandas CSV去重逻辑错误排查:重复行误写入问题求助
CSV处理脚本错误排查方案
以下是针对你的脚本问题的具体排查方向和验证步骤:
1. 排序逻辑验证
确认脚本对yesterday.csv的排序是否符合预期:
- 在排序后打印前5行数据,检查目标行(Ale Mary's开头的行)是否出现在排序结果的靠前位置(如果是按值降序取最高)。
- 检查排序时指定的列索引是否正确,比如你要按某列的数值排序,是否误将字符串列当成数值列排序(比如列值是字符串格式的数字,直接排序会按字典序而非数值序)。
示例代码:
import csv with open('yesterday.csv', 'r', newline='') as f: reader = csv.reader(f) header = next(reader) # 跳过表头 # 假设按第7列(索引6)的数值降序排序,根据你的实际需求修改列索引 sorted_rows = sorted(reader, key=lambda x: float(x[6]), reverse=True) print("排序后前5行:") for row in sorted_rows[:5]: print(row)
2. 重复检查的列索引确认
你需要检查的是第3、4、5列,但Python的csv.reader是0索引,对应索引应为2、3、4。如果脚本中误用了3、4、5(对应第4、5、6列),会导致检查的列完全错误,自然无法正确判断重复。
- 打印脚本中用于判断重复的键值,对比问题行的实际列值:
# 问题行的第3、4、5列值 target_key = ("Bourbon County Brand Stout (2018) 14.7%", "Goose Island Beer Co.", "2898") # 错误行的第3、4、5列值 wrong_key = ("Kentucky Breakfast Stout (KBS) (2015)", "Founders Brewing Co.", "549") print("目标行键值:", target_key) print("错误行键值:", wrong_key)
然后对比脚本中提取的键是否和上述一致。
3. 重复判断逻辑检查
核心错误可能出在判断条件的逻辑上:
- 如果脚本中写的是
if key in existing_keys: break,会导致找到第一个重复行就停止,直接写入该行;正确逻辑应该是if key in existing_keys: continue,跳过重复行继续查找下一个。 - 验证
existing_keys集合是否正确包含了tops.csv中所有行的第3、4、5列组合:
existing_keys = set() with open('tops.csv', 'r', newline='') as f: reader = csv.reader(f) next(reader) # 跳过表头(如果有) for row in reader: key = (row[2], row[3], row[4]) existing_keys.add(key) # 检查错误行的键是否存在于tops.csv中 print("错误行键是否存在:", wrong_key in existing_keys) # 检查目标行的键是否存在 print("目标行键是否存在:", target_key in existing_keys)
如果输出显示错误行键存在,但脚本还是写入了,说明判断逻辑写反了。
4. 数据格式与表头处理
- 检查两个CSV文件是否包含表头,脚本中是否都跳过了表头行。如果
tops.csv的表头被当成数据行加入existing_keys,会导致错误的判断。 - 检查列值是否有隐藏字符(如前后空格、换行符),可以用
repr()函数查看字符串的原始格式:
# 以错误行的第3列为例 print(repr("Kentucky Breakfast Stout (KBS) (2015)")) # 对比tops.csv中对应行的第3列 print(repr(tops_row[2])) # tops_row是tops.csv中错误行的内容
如果两者格式不一致(比如一个带空格一个不带),会导致判断为不重复,实际应该视为重复。
5. 写入逻辑验证
确认脚本找到符合条件的行后,是否正确执行了:
- 将行写入
for_email.csv - 将行追加到
tops.csv
检查tops.csv在运行脚本后是否确实追加了错误行,确认不是之前测试残留的数据导致的误解。
内容的提问来源于stack exchange,提问作者Tendekai Muchenje
相关产品推荐
相关产品推荐

