代码之家  ›  专栏  ›  技术社区  ›  SDG

想在n-1级(不包含任何子文件夹的文件夹)创建一个目录列表,其中包含bash或python

  •  5
  • SDG  · 技术社区  · 6 年前

    我现在有一个问题,我想得到一个目录列表,在n-1级别。结构看起来有点像下面的图表,我想要一个所有蓝色文件夹的列表。但是,树的高度在整个文件系统中各不相同。

    由于所有蓝色文件夹的名称通常以字符串结尾 images ,因此我已将代码写入 python below:。

    def getdirlist(dir):
    dirlist=[x[0]对于os.walk中的x(dir)]
    返回目录
    
    olddirlist=getdirlist(sys.argv[1])
    
    DistList=
    
    #获取文件夹的黑客方法
    对于i,dir in enumerate(olddirlist):
    if dir.endswith(“图像”):
    dirlist.append(olddirlist[i]+'/')
    < /代码> 
    
    

    现在,我不想使用这个方法,因为我想要这个问题的一般解决方案,使用python或bash脚本,然后将bash脚本结果读取到python。哪一个在实践和理论上更有效?

    enter image description here

    由于所有蓝色文件夹的名称通常以字符串结尾images,我已经把代码写进去了Python以下:

    def getDirList(dir):
        dirList = [x[0] for x in os.walk(dir)]
        return dirList
    
    oldDirList = getDirList(sys.argv[1])
    
    dirList = []
    
    # Hack method for getting the folders
    for i, dir in enumerate(oldDirList):
        if dir.endswith('images'):
            dirList.append(oldDirList[i] + '/')
    

    现在,我不想使用这个方法,因为我想要这个问题的一般解决方案,蟒蛇或者bash脚本,然后将bash脚本结果读取到蟒蛇. 哪一个在实践和理论上更有效?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Green Cloak Guy    6 年前

    要重新表述我认为您要求的内容,您需要列出不包含任何子文件夹(因此只包含非文件夹文件)的所有文件夹。

    你可以使用 os.walk() 这很容易。 () 返回三个元组的不可数( dirname , subdirectories ,请 filenames )我们可以围绕该输出包装一个列表理解,只从文件树中选择“叶”目录-只收集所有 dirnames 没有子目录。

    import os
    
    dirList = [d[0] for d in os.walk('root/directory/path') if len(d[1]) == 0]
    
        2
  •  2
  •   killian95    6 年前

    另一种说明问题的方法是,您希望所有不包含子文件夹的文件夹都存在?如果是这样,那么您可以利用os.walk列出文件夹中的所有子文件夹这一事实。如果该列表为空,则将其附加到 dirList

    import os
    import sys
    
    def getDirList(dir):
        # x[1] contains the list of subfolders
        dirList = [(x[0], x[1]) for x in os.walk(dir)]
        return dirList
    
    oldDirList = getDirList(sys.argv[1])
    
    dirList = []
    
    for i, dir in enumerate(oldDirList):
        if not dir[1]:    # if the list of subfolders is not empty
            dirList.append(dir[0])
    
    print dirList
    
        3
  •  2
  •   chalwa    6 年前

    今天我也遇到了类似的问题。

    尝试PATLIB: https://docs.python.org/3/library/pathlib.html

    from pathlib import PurePath
    import os, sys
    
    #os.getcwd() returns path of red_dir if script is inside
    gray_dir = PurePath(os.getcwd()).parents[1]  # .parents[1] returns n-1 path 
    blue_things = os.listdir(gray_dir)
    
    
    blue_dirs = []
    for thing in blue_things:
        if os.path.isdir(str(gray_dir) + "\\" + str(thing)):  # make sure not to append files
            blue_dirs.append(thing)
    
    print(blue_dirs)