在Python中创建目录子文件夹时出现错误(附相关代码)
排查并解决Python目录创建的问题
嘿,我帮你梳理下代码里的几个关键问题,逐个解决:
1. 路径转义踩坑(最容易触发报错的点)
你写的路径用了\,但在Python字符串里\是转义字符,比如\T会被解析成制表符,导致系统识别不出正确的路径,这绝对是常见的入门坑!解决方法超简单,二选一就行:
- 用原始字符串:在路径前面加个
r,比如r'I:\DATA\Train'和r'C:\DATA',这样Python就不会把反斜杠当成转义符了 - 直接用正斜杠代替反斜杠:
'I:/DATA/Train',Windows系统完全支持这种写法
2. 第一个代码块:创建文件夹的逻辑跑偏了
你当前的代码是遍历I:\DATA\Train下的所有文件,去掉扩展名后,在你运行脚本的当前工作目录创建同名文件夹——这大概率不是你想要的效果吧?而且如果不同子目录下有同名文件,还会重复创建(虽然exist_ok=True不会报错,但逻辑会乱)。
假设你的需求是在每个文件所在的目录下,创建一个和文件名(不含扩展名)同名的子文件夹,我帮你改好了代码:
import os # 遍历目标目录及其所有子目录 for folderName, subfolders, filenames in os.walk(r'I:\DATA\Train'): print(f'The current folder is {folderName}') for filename in filenames: # 提取文件名(去掉扩展名) file_prefix = os.path.splitext(filename)[0] # 拼接要创建的文件夹路径:文件所在目录 + 文件名前缀 target_folder = os.path.join(folderName, file_prefix) # 创建文件夹(如果已经存在就跳过,不会报错) os.makedirs(target_folder, exist_ok=True) print(f'Created folder: {target_folder}') print('')
要是你的需求是在某个固定目录下,为所有文件创建同名文件夹,那只要指定一个固定的根目录就行,比如:
import os # 先指定你要创建文件夹的根目录 root_target = r'C:\Your\Target\Directory' os.makedirs(root_target, exist_ok=True) for folderName, subfolders, filenames in os.walk(r'I:\DATA\Train'): print(f'The current folder is {folderName}') for filename in filenames: file_prefix = os.path.splitext(filename)[0] target_folder = os.path.join(root_target, file_prefix) os.makedirs(target_folder, exist_ok=True) print(f'Created folder: {target_folder}') print('')
3. 第二个代码块:子文件夹创建的代码没写完呀
你当前的代码只是遍历并打印C:\DATA的子文件夹,但完全没有创建逻辑。如果你的需求是把I:\DATA\Train的子文件夹结构复制到C:\DATA,可以用下面的代码:
import os source_path = r'I:\DATA\Train' target_path = r'C:\DATA' for folderName, subfolders, filenames in os.walk(source_path): # 计算原目录的相对路径,用来在目标目录重建相同的结构 relative_path = os.path.relpath(folderName, source_path) target_folder = os.path.join(target_path, relative_path) os.makedirs(target_folder, exist_ok=True) print(f'Created folder structure: {target_folder}')
最后说下常见报错的对应解决
- 要是遇到
FileNotFoundError:90%是路径转义的问题,换成原始字符串或正斜杠就搞定 - 要是遇到
PermissionError:检查下目标路径你有没有读写权限,或者右键以管理员身份运行脚本 - 要是遇到
FileExistsError:记得给os.makedirs加上exist_ok=True参数,重复创建也不会报错
内容的提问来源于stack exchange,提问作者hamzasgd
相关产品推荐
相关产品推荐

