在子文件夹中创建文件夹
Create Folders within SubFolders
我是 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: [Errno 2] No such file or directory: '/Users/diunt-02/Desktop/Brown_Brothers/TEST/new/new'
我认为循环正在创建新文件夹,os.walk 找不到它们的路径。对于让 os.walk 进入下一层并在那里创建文件夹有什么建议吗?
如果您只是想在根目录的每个孙目录中创建一个子目录,使用 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
它将所有不同的 "levels" 混合在一起。但是您不想在每个级别都做同样的事情。您只想在孙子中创建新目录,而不是子目录,也不是曾孙目录,尤其是您在此过程中创建的任何后代目录。
当然,您可以尝试在上下移动时跟踪关卡,或者您可能会看到如何从 dirpath
动态重新创建关卡,但为什么呢?如果你想做一些恰好向下 2 级的事情,不要遍历所有级别然后测试 2 级,只需向下 2 级。
这是我最终得到的代码,效果非常好!感谢@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)
只需使用os.makedirs。它会自动创建必要的父文件夹。
path = 'Main Folder/Folder a/Folder 1'
if not (os.path.exists(path)):
os.makedirs(path)
你可以用递归的方式来解决你的问题。
我是 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: [Errno 2] No such file or directory: '/Users/diunt-02/Desktop/Brown_Brothers/TEST/new/new'
我认为循环正在创建新文件夹,os.walk 找不到它们的路径。对于让 os.walk 进入下一层并在那里创建文件夹有什么建议吗?
如果您只是想在根目录的每个孙目录中创建一个子目录,使用 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
它将所有不同的 "levels" 混合在一起。但是您不想在每个级别都做同样的事情。您只想在孙子中创建新目录,而不是子目录,也不是曾孙目录,尤其是您在此过程中创建的任何后代目录。
当然,您可以尝试在上下移动时跟踪关卡,或者您可能会看到如何从 dirpath
动态重新创建关卡,但为什么呢?如果你想做一些恰好向下 2 级的事情,不要遍历所有级别然后测试 2 级,只需向下 2 级。
这是我最终得到的代码,效果非常好!感谢@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)
只需使用os.makedirs。它会自动创建必要的父文件夹。
path = 'Main Folder/Folder a/Folder 1'
if not (os.path.exists(path)):
os.makedirs(path)
你可以用递归的方式来解决你的问题。