【问题标题】:Create Folders within SubFolders在子文件夹中创建文件夹
【发布时间】:2018-12-02 10:00:54
【问题描述】:

我是 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] 没有这样的文件或目录:'/Users/diunt-02/Desktop/Brown_Brothers/TEST/new/new'

我认为循环正在创建新文件夹,而 os.walk 无法找到它们的路径。有什么建议让 os.walk 进入下一层并在那里创建一个文件夹?

【问题讨论】:

  • 错误出现在哪一行?有行号吗?
  • 另外,坚持os.path.join 获取新路径
  • 感谢您的帮助!我在 os.mkdir(newFolder) 行收到错误。

标签: python directory os.walk subdirectory


【解决方案1】:

如果您只是想在根目录的每个孙子目录中创建一个子目录,那么使用 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 级。

【讨论】:

  • 这很有帮助,而且解释得很好!我知道我需要进一步降低水平,但我完全可以弄清楚如何做。你解释得真好!
【解决方案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)

【讨论】:

    【解决方案3】:

    只需使用os.makedirs。它会自动创建必要的父文件夹。

    path = 'Main Folder/Folder a/Folder 1'
    if not (os.path.exists(path)):
        os.makedirs(path)
    

    您可以以递归方式使用它来解决您的问题。

    【讨论】: