Python CSV处理代码误清空文件问题求助
问题排查与修复
原代码核心错误分析
- 行号判断逻辑颠倒:
用户要求检查自然偶数行(第2、4、6...行),但原代码中row_num%2==0匹配的是第1、3、5...行(因为row_num从0开始,且在循环末尾才递增),导致检查对象完全错误。 - 业务逻辑与需求偏离:
- 需求是成对处理「上一行+当前偶数行」,但代码逐行处理,逻辑混乱。
- 错误使用
row[1:]截断行,违反「保留整行」的要求。 new_rows.pop()的逻辑错误,会误删之前的有效行,甚至在空列表时引发异常风险。
- 行号递增时机错误:
在append之后才递增row_num,导致行号与实际行的对应关系完全错位。
修复后的代码
import csv def scan_csv_file(file_path): """ 处理CSV文件: - 检查自然偶数行(第2、4、6...行)是否包含"Census 1850" - 若包含,保留该行及紧邻的上一行 - 若不包含,删除该行及上一行 - 若总行数为奇数,最后一行单独保留(无对应偶数行需检查) """ try: # 读取所有行到内存 with open(file_path, 'r', newline='') as file: csv_reader = csv.reader(file) all_rows = list(csv_reader) new_rows = [] # 成对处理行:每对是[奇数行, 偶数行](自然行号) for i in range(0, len(all_rows), 2): # 处理到最后一行(奇数行,无对应偶数行) if i + 1 >= len(all_rows): new_rows.append(all_rows[i]) continue row_odd = all_rows[i] # 上一行(自然奇数行) row_even = all_rows[i+1] # 当前检查的偶数行 # 检查偶数行是否包含目标短语 if "Census 1850" in ','.join(row_even): # 保留两行 new_rows.append(row_odd) new_rows.append(row_even) # 不包含则跳过这两行,不添加 # 写入处理后的内容 with open(file_path, 'w', newline='') as file: csv_writer = csv.writer(file) csv_writer.writerows(new_rows) print("CSV文件处理完成。") except Exception as e: print(f"错误:{e}") file_path = r"C:\Users\My Name\Downloads\tracing_the_land_2_test.csv" scan_csv_file(file_path)
修复说明
- 成对处理逻辑:通过
range(0, len(all_rows), 2)遍历,每次处理两行(自然奇数行+偶数行),完全符合需求的成对保留/删除规则。 - 行号逻辑纠正:直接通过索引定位自然偶数行(
i+1位置),避免行号计数混乱。 - 边界情况处理:如果总行数为奇数,最后一行(无对应偶数行)会被单独保留。
- 符合需求的保留规则:找到目标短语时完整保留两行,否则直接跳过,逻辑清晰无歧义。
内容的提问来源于stack exchange,提问作者asdf0089
相关产品推荐
相关产品推荐

