Python给CSV添加上级目录名前缀:代码部分成功后触发文件未找到错误
给多级嵌套CSV文件添加上级文件夹前缀时的FileNotFoundError问题解决
需求说明
需要给嵌套在多级子文件夹中的CSV文件添加其顶层父文件夹(如Folder1、Folder2)作为文件名前缀,原目录结构与目标目录结构如下:
原目录结构
Folder1 Apples Apples2 Filename1.csv Oranges Oranges2 Filenameb.csv Folder2 Blueberry Blueberry2 Filename2.csv Oranges Oranges2 Filenamec.csv
目标目录结构
Folder1 Apples Apples2 Folder1_Filename1.csv Oranges Oranges2 Folder1_Filenameb.csv Folder2 Blueberry Blueberry2 Folder2_Filename2.csv Oranges Oranges2 Folder2_Filenamec.csv
遇到的问题
编写的代码仅成功重命名约5个文件后中断,触发FileNotFoundError:
FileNotFoundError: [WinError 2] The system cannot find the file specified:
原代码
import os.path from pathlib import PurePath pathway= r”path_to_directory” for root,dirs,files in os.walk(pathway) try: addition = PurePath(root).parts[-3] for file in files: if file.endswith(".csv"): newname =addition + '_' + file #print(newname, os.path.join(root,newname)) print(newname) os.rename(os.path.join(root,file),os.path.join(root,newname)) except IndexError: pass
问题分析与修正
原代码存在的问题
- 语法错误:
for root,dirs,files in os.walk(pathway)语句末尾缺少冒号,会导致代码无法正常执行 - 中文引号/转义错误:路径字符串使用了中文引号
r”path_to_directory”,文件后缀判断用了转义的".csv",这些都会导致字符串解析异常,进而引发路径找不到的错误 - 层级索引不可靠:
PurePath(root).parts[-3]依赖固定的目录层级索引,当os.walk遍历到不同深度的目录时,可能获取到错误的前缀,甚至触发IndexError(虽有捕获,但会导致不必要的跳过或错误处理)
修正后的代码
import os from pathlib import Path # 替换为你的实际目标目录,使用英文引号 pathway = r"path_to_directory" base_path = Path(pathway) # 递归查找所有CSV文件 for csv_file in base_path.rglob("*.csv"): # 获取文件相对于根目录的路径片段,第一个片段即为目标前缀(Folder1/Folder2) relative_parts = csv_file.relative_to(base_path).parts prefix = relative_parts[0] # 构造新文件名 new_filename = f"{prefix}_{csv_file.name}" # 拼接新的文件路径 new_file_path = csv_file.parent / new_filename # 执行重命名 os.rename(csv_file, new_file_path)
修正点说明
- 修复了语法错误,确保代码结构合法
- 统一使用英文引号,避免字符串解析错误
- 使用
Path.rglob直接递归定位所有CSV文件,无需遍历无关目录 - 通过
relative_to获取相对路径,直接取第一个路径片段作为前缀,适配任意深度的子目录结构,避免固定索引的不可靠性 - 利用
Path对象的路径拼接特性,确保跨系统的路径兼容性
内容的提问来源于stack exchange,提问作者KC7777
相关产品推荐
相关产品推荐

