【问题标题】:How to get different lists of file paths depending on subdirs?如何根据子目录获取不同的文件路径列表?
【发布时间】:2023-06-03 09:20:02
【问题描述】:
-Root
--A
---1,2
--B
---3

我正在尝试获取基于子目录的路径列表:

[['Root/A/1','Root/A/2'],['Root/B/3']]

我尝试使用 os.walk,但无法正常工作。我可以在一个巨大的列表中获取所有文件的列表,但我无法根据子目录拆分这些文件

fullList = []
for root, dirs, files in os.walk(dir):
        for name in files:
            fullList.append(os.path.join(root, name))

【问题讨论】:

    标签: python python-3.x list path os.walk


    【解决方案1】:

    您想要一个列表列表,但您创建了一个字符串列表。您需要创建每个内部列表并将它们全部放在一个主列表中。

    这个程序可能会做你想做的事:

    import os
    from pprint import pprint
    
    
    def return_list_of_paths(dir='.'):
        return [[os.path.join(root, file) for file in files]
                for root, dirs, files in os.walk(dir)
                if files]
    
    
    pprint(return_list_of_paths("ROOT"))
    

    或者,如果您不关心列表推导:

    import os
    from pprint import pprint
    
    
    def return_list_of_paths(dir='.'):
        fullList = []
        for root, dirs, files in os.walk(dir):
            if files:
                oneList = []
                for file in files:
                    oneList.append(os.path.join(root, file))
                fullList.append(oneList)
        return fullList
    
    
    pprint(return_list_of_paths("ROOT"))
    

    【讨论】:

    • 嘿,第一个正是我想要的,但你能带我看一下这段代码吗?我对python相当陌生,无法真正解析那段代码。非常感谢!
    • 我查看了第二个代码块并理解了您所做的,除了一件事:“如果文件:”部分是做什么的?谢谢!
    • 这两个版本在功能上是相同的。每当您构建这样的列表时:l = []; for x in y: l.append(z) 您可以将其替换为 l = [z for x in y]。请参阅this documentation 或谷歌python list comprehension 了解更多详情。
    • if files 是为了避免在有空子目录的情况下添加空子列表。尝试创建一个空的“C”目录并运行带有和不带有if files: 行的程序。
    最近更新 更多