
本文介绍一种安全、高效的方法,通过读取原始csv、条件分流写入两个新文件(“已用”与“未用”),再用“未用”文件覆盖原文件,实现数据行的精准迁移与清理。
本文介绍一种安全、高效的方法,通过读取原始csv、条件分流写入两个新文件(“已用”与“未用”),再用“未用”文件覆盖原文件,实现数据行的精准迁移与清理。
在实际数据处理流程中(如批量邮件发送、任务队列消费、ETL抽取等),常需将已处理的记录从源CSV中“移出”,既保留操作痕迹(存入 used.csv),又确保后续运行只处理剩余数据。CSV本身不支持原地删除行,因此必须采用“读–分–写–替换”的策略:一次性读取全部内容,按业务逻辑分流写入两个独立文件,最后用“未用数据”文件安全覆盖原始文件。
以下是一个完整、健壮的实现示例。假设我们希望将所有 Department == "Marketing" 的员工记录移至 used.csv,其余保留在更新后的 data.csv 中:
本文档主要讲述的是maven使用方法;Maven是基于项目对象模型的(pom),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven将你的注意力从昨夜基层转移到项目管理层。Maven项目已经能够知道 如何构建和捆绑代码,运行测试,生成文档并宿主项目网页。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
import csv
import shutil
# 定义路径
input_file = "data.csv"
used_file = "used.csv"
temp_file = "data_temp.csv" # 避免直接覆盖时出错
# 步骤1:打开输入与两个输出文件(注意:必须指定 newline='')
with open(input_file, newline='') as f_in, \
open(used_file, "w", newline='') as f_used, \
open(temp_file, "w", newline='') as f_temp:
reader = csv.reader(f_in)
writer_used = csv.writer(f_used)
writer_temp = csv.writer(f_temp)
# 步骤2:读取并写入表头(如有)
try:
header = next(reader)
writer_used.writerow(header)
writer_temp.writerow(header)
except StopIteration:
# 空文件,直接退出
pass
# 步骤3:逐行判断并分流写入
for row in reader:
if len(row) > 1 and row[1].strip() == "Marketing": # 防止索引越界 + 去空格
writer_used.writerow(row)
else:
writer_temp.writerow(row)
# 步骤4:原子化替换原文件(关键!)
shutil.move(temp_file, input_file)
print(f"✅ 已成功将 {sum(1 for _ in open(used_file))) - (1 if sum(1 for _ in open(used_file)) > 0 else 0)} 条 Marketing 记录移入 '{used_file}'")
print(f"✅ 原始文件 '{input_file}' 已更新为剩余数据。")✅ 关键注意事项:
- 永远使用 newline='':避免在 Windows 下产生多余空行(Python CSV 模块强制要求);
- 优先使用 with 语句管理文件:确保异常时自动关闭,提升健壮性(原答案中“无需手动关闭”仅适用于极简脚本,生产环境务必显式管理);
- 表头处理要安全:用 try/except 处理无表头或空文件场景;
- 字段校验不可少:访问 row[1] 前检查长度,避免 IndexError;
- 替换务必原子化:先写入临时文件,再 shutil.move() 替换,防止中断导致原文件损坏;
- 如需增量处理(每次只移1行):可封装为函数,配合外部循环调用,并在每次移动后重新加载 data.csv。
该方法不依赖第三方库,兼容 Python 3.6+,逻辑清晰、可审计性强——每条被移走的数据都明确留存于 used.csv,原始文件始终保持有效状态,是自动化数据流水线中的推荐实践。









