Python写入CSV时出现WinError 2文件找不到问题求助
问题分析与解决方案
你的核心问题是循环中重复以写入模式操作同一CSV文件时,Windows文件系统的IO延迟导致短暂的文件状态不一致,进而触发WinError 2。结合代码逻辑,下面拆解原因并给出修复方案:
错误根源
- 重复覆盖写入的竞态问题:代码每遇到带附件的HTML文件,就用
"w"模式打开目标CSV——这个模式会先删除原有文件(如果存在)再重建。Windows文件系统在处理文件删除/重建的IO操作时,存在短暂的缓存或索引更新延迟,当循环执行速度较快时,前一次的文件关闭操作还未完全落地,下一次打开就可能找不到文件,触发错误。 - 代码逻辑冗余(非直接报错原因,但影响需求达成):每次有附件就覆盖整个CSV,最终文件只会保留最后一个带附件的HTML文件的数据,这显然不符合“遍历数千文件提取数据”的需求。
- 语法隐患:原代码中
escapechar='\是语法错误,需写成escapechar='\\'(反斜杠需转义)。
修复方案
方案1:改为追加模式(收集所有附件数据,符合遍历提取的核心需求)
如果需要把所有HTML文件的附件数据汇总到同一个CSV,用追加模式("a"),并仅在第一次写入时添加表头:
import os import csv path = "C:/000-backup/43 - Windows/threads/" outputPath = "c:/temp/data/" outputFile = "043" errFile = os.path.join(outputPath, f"{outputFile}_error.txt") saveAttachments = os.path.join(outputPath, f"{outputFile}_attachments_001.csv") # 确保输出目录存在,避免路径不存在导致的创建失败 os.makedirs(outputPath, exist_ok=True) has_written_header = False dir_list = os.listdir(path) for f in dir_list: file_path = os.path.join(path, f) if os.path.isfile(file_path) and f.lower().endswith(".html"): try: data = parseFile(file_path) if data['attachments']: with open(saveAttachments, "a", newline='', encoding="utf-8") as fi: writer = csv.writer(fi, quoting=csv.QUOTE_NONNUMERIC, escapechar='\\') # 首次写入时添加表头(假设attachments是字典列表) if not has_written_header: writer.writerow(data['attachments'][0].keys()) has_written_header = True writer.writerows([row.values() for row in data['attachments']]) except Exception as e: print(e) with open(errFile, 'a', newline='\n', encoding='utf-8') as fi: fi.write(f"{f}\n")
方案2:强制IO落地(若确实需要覆盖写入)
如果需求是每次用最新的附件数据覆盖CSV,可在写入后强制刷新磁盘,给Windows文件系统足够的状态更新时间:
# 循环内写入部分修改 if data['attachments']: with open(saveAttachments, "w", newline='', encoding="utf-8") as fi: writer = csv.writer(fi, quoting=csv.QUOTE_NONNUMERIC, escapechar='\\') writer.writerows(data['attachments']) fi.flush() # 强制刷新缓冲区 os.fsync(fi.fileno()) # 强制将数据写入磁盘 # 可选:添加极短延迟,缓解Windows IO延迟 import time time.sleep(0.01)
额外优化点
- 用
os.path.join()拼接路径,避免手动拼接斜杠导致的跨平台问题或路径错误。 - 提前检查并创建输出目录,排除因目录不存在导致的隐性错误。
内容的提问来源于stack exchange,提问作者Phaelax
相关产品推荐
相关产品推荐

