如何用Python3读取CSV文件时删除已处理的上一行
处理CSV文件时删除已完成行的Python方案
嗨,我来帮你搞定这个需求!你希望每处理完CSV里的一行维基页面任务,就把该行从文件中移除,这样剩下的待处理内容能直接分享给其他维基贡献者,不用手动删除对吧?
直接在读取文件的同时修改原文件很容易出问题(比如文件指针混乱、数据丢失),我推荐用临时文件中转的方式,安全又可靠。核心思路是:遍历原CSV的每一行,处理成功的行就跳过,未处理/处理失败的行写入临时文件,最后用临时文件替换原CSV。
下面是修改后的完整代码,我还加了异常处理,避免处理页面出错时误删任务行:
import csv import pywikibot import os import tempfile # 原CSV文件路径 csv_path = '0.csv' # 创建临时文件,用来存储未处理的行 with tempfile.NamedTemporaryFile(mode='w', delete=False, newline='', encoding='utf-8') as temp_file: writer = csv.writer(temp_file, delimiter="~") with open(csv_path, 'r', encoding='utf-8') as csvfile: reader = csv.reader(csvfile, delimiter="~") for row in reader: # 保留你原有的行长度判断逻辑 if len(row) == 8: wikiPage1 = row[0] indexPages = row[5] print(f"正在处理页面: {wikiPage1}") try: # 维基页面修改操作 site = pywikibot.Site('ta', 'wiktionary') page1 = pywikibot.Page(site, wikiPage1) page1.text = page1.text.replace('Number','எண்') page1.save(summary='Number --> எண்') # 处理成功,不写入临时文件(相当于删除该行) print(f"页面 {wikiPage1} 处理完成,已从待处理列表移除") except Exception as e: # 处理失败,把该行写回临时文件,方便重试 writer.writerow(row) print(f"页面 {wikiPage1} 处理失败,保留至待处理列表: {str(e)}") else: # 不符合格式的行,也写回临时文件 writer.writerow(row) # 用临时文件替换原CSV文件(原子操作,避免数据丢失) os.replace(temp_file.name, csv_path) print("所有任务处理完成,待处理列表已更新")
关键说明:
- 使用
tempfile.NamedTemporaryFile创建临时文件,避免手动管理临时文件路径 - 异常捕获确保处理失败的页面不会被误删,能留在CSV里重试
os.replace是原子性操作,中途出错也不会损坏原文件- 全程指定
encoding='utf-8',避免泰米尔文或其他字符出现乱码问题
这样处理后,每次运行脚本,原CSV里只会剩下未处理的行,你可以直接把这个文件分享给其他贡献者继续处理啦!
内容的提问来源于stack exchange,提问作者info-farmer
相关产品推荐
相关产品推荐

