我是python的新手,我正在寻找一种在子文件夹中创建子文件夹的方法。我的文件树如下所示:
>> Main Folder
>> Folder a
>> Folder 1
>> Folder 2
>> Folder b
>> Folder 1
>> Folder 2
我正在寻找一种在最底层创建新文件夹(文件夹1和文件夹2)的方法。
我已经尝试过使用os.walk和os.path
for dirpath, subdirs, files in os.walk(current_path):
for subdir in subdirs:
filePath = os.path.abspath(subdir)
newFolder = (filePath + "/new")
if not os.path.exists(newFolder):
os.mkdir(newFolder)
但这只会在第二级(文件夹a和文件夹b)中创建一个新文件夹,然后给我错误:
FileNotFoundError:[错误2]没有这样的文件或目录:'/ Users / diunt-02 / Desktop / Brown_Brothers / TEST / new / new'
我认为循环正在创建新文件夹,而os.walk无法找到它们的路径。有什么建议可以使os.walk移至下一层并在其中创建一个文件夹?
答案 0 :(得分:0)
如果您只是想在根目录的每个子目录中创建一个子目录,则使用os.walk
只会使事情更加混乱。我将解释原因,但首先,我将解释更简单的方法。
只需显式地向下循环两个级别:
for child in os.scandir(current_path):
if child.is_dir():
for grandchild in os.scandir(child.path):
newpath = os.path.join(grandchild.path, 'new')
os.path.mkdir(newpath)
现在,为什么您现有的代码被破坏了?
walk
遍历整棵树。它会访问您的根,孩子,孙子,曾孙,甚至是您在行走过程中创建的新孙子。
例如,尝试以下操作:
for dirpath, _, _ in os.walk(current_path):
print(dirpath)
您得到的是:
.
./Folder b
./Folder b/Folder 2
./Folder b/Folder 1
./Folder a
./Folder a/Folder 2
./Folder a/Folder 1
它将所有不同的“级别”混合在一起。但是,您不想在每个级别上都做相同的事情。您只想在孙子代中创建新目录,而不是子孙,也不应该在曾孙中创建新目录,尤其是在创建过程中创建的任何后代中。
当然,您可以尝试在上下移动时保持水平,或者可以看到如何从dirpath
即时重新创建它,但是为什么呢?如果您想做2级以下的事情,请不要遍历所有级别,然后再测试2级,只需降低2级即可。
答案 1 :(得分:0)
这是我最终得到的代码,效果很好!感谢@abarnert很好地解释了为什么os.walk没有用!
for child in os.scandir(current_path):
if child.is_dir():
for grandchild in os.scandir(child.path):
# newpath = os.path.join(grandchild.path, 'new')
# os.mkdir(newpath)
if grandchild.is_dir():
newpath = os.path.join(grandchild.path, 'new')
os.mkdir(newpath)
答案 2 :(得分:0)
只需使用os.makedirs。它会自动创建必要的父文件夹。
path = 'Main Folder/Folder a/Folder 1'
if not (os.path.exists(path)):
os.makedirs(path)
您可以递归地使用它来解决问题。