【问题标题】:Python Function that take n number of arguments as list and create folder and sub folders based on their index将 n 个参数作为列表并根据其索引创建文件夹和子文件夹的 Python 函数
【发布时间】:2022-01-23 11:24:29
【问题描述】:

我正在创建一个 python 函数,它将“n”个参数作为列表,并根据它们的位置创建文件夹和嵌套文件夹 例如。

path = Path("Path to Directory")
root_folders = ['f1','f2','f3']
yr = ['2018', '2019']
mnth = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']

“root_folders”应该是“路径”中的主文件夹 “yr”应该是每个“root_folders”的子文件夹 “mnth”是每个“yr”的子文件夹

我已经能够使用以下代码实现这一点:

def folder(root,*args):
    for a in args[0]:
        path = os.path.join(root, a)
        if not os.path.exists(path):
            os.mkdir(path)          
            for b in args[1]  :
                path2 = os.path.join(path, b)
                if not os.path.exists(path2):
                    os.mkdir(path2)
                for c in args[2]  :
                    path3 = os.path.join(path2, c)
                    if not os.path.exists(path3):
                        os.mkdir(path3)

folder(path,root_folders,yr,mnth)

但这有一定的局限性,因为嵌套文件夹增加了可伸缩性会成为问题。那么是否有任何解决方案可以使用递归或任何其他方法来实现

【问题讨论】:

    标签: python function loops recursion subdirectory


    【解决方案1】:

    您可以使用递归来创建文件夹,在每次调用时向文件夹创建函数传递一个运行路径:

    import os
    def create_folders(root, *args):
      if args:
        for i in args[0]:
          os.mkdir(p:=os.path.join(root, i))
          create_folders(p, *args[1:])
    
    root_folders = ['f1','f2','f3']
    yr = ['2018', '2019']
    mnth = ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']
    create_folders(os.getcwd(), root_folders, yr, mnth)
    

    【讨论】:

      【解决方案2】:

      不确定这是否是您想要的,但我为您准备了一个简短的函数,它使用递归从字典中创建文件夹结构:

      def folder(root, folderdict, subdir=""):
      """
      The folderdict could look something like this:
      folderdict = {folder1: None, folder2: None, folder3:{subfolder1: None, subfolder2: {subsubfolder1}}}
      """
      # set up path progression for recursion
      current_directory = os.path.join(root, subdir)
      
      for foldername, subfolders in folderdict.items():
          path = os.path.join(current_directory, foldername)
      
          if not os.path.exists(path):
              os.mkdir(path)
      
          # check if newly created path should contain subfolders
          # if so: start recursion
          if subfolders is not None:
              new_subdir = os.path.join(subdir, foldername)
              folder(root, subfolders, new_subdir)
      

      不过要小心。递归通常不能很好地扩展。

      【讨论】:

      • 只是想把它留在这里作为额外的说明:这既不是 linted,也不是经过彻底测试。所以更多地把它当作一个 PoC
      猜你喜欢
      • 2020-08-10
      • 2021-03-18
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多