【问题标题】:Can os.walk() be used on a list of strings? If not, what would be the equivalent?os.walk() 可以用于字符串列表吗?如果不是,那将是什么等价物?
【发布时间】:2017-02-03 18:59:36
【问题描述】:

是否可以给它一个预制的字符串列表,而不是使用真实的文件结构,让它为你创建一个嵌套的路径/文件列表?

示例列表(格式化以便可读):

files = [
    'user/hey.jpg',
    'user/folder1/1.txt',
    'user/folder1/folder2/random.txt',
    'user/folder1/blah.txt',
    'user/folder3/folder4/folder5/1.txt',
    'user/folder3/folder4/folder5/3.txt',
    'user/folder3/folder4/folder5/2.txt',
    'user/1.jpg'
    ]

这是我希望的输出:

['user'['1.jpg','hey.jpg','folder1'['1.txt','blah.txt','folder2'['random.txt']],'folder3'['folder4'['folder5'['1.txt','2.txt','3.txt']]]]]

我在这里问了一个类似的问题:How would I nest file path strings into a list based upon matching folder paths in Python

我收到一条评论说os.walk() 是我想要的理想选择,但无论我看哪里,似乎人们都在使用它来爬取文件系统,而不是向它传递已创建文件路径的列表。

【问题讨论】:

    标签: python python-2.7 python-2.x


    【解决方案1】:

    只需创建一棵树。显示示例的快速草稿:

    import pprint
    
    files = [
        'user/hey.jpg',
        'user/folder1/1.txt',
        'user/folder1/folder2/random.txt',
        'user/folder1/blah.txt',
        'user/folder3/folder4/folder5/1.txt',
        'user/folder3/folder4/folder5/3.txt',
        'user/folder3/folder4/folder5/2.txt',
        'user/1.jpg'
        ]
    
    def append_to_tree(node, c):
        if not c:
            return
    
        if c[0] not in node:
            node[c[0]] = {}
    
        append_to_tree(node[c[0]], c[1:])
    
    root = {}
    for path in files:
        append_to_tree(root, path.split('/'))
    
    pprint.pprint(root)
    

    输出:

    {'user': {'1.jpg': {},
              'folder1': {'1.txt': {},
                          'blah.txt': {},
                          'folder2': {'random.txt': {}}},
              'folder3': {'folder4': {'folder5': {'1.txt': {},
                                                  '2.txt': {},
                                                  '3.txt': {}}}},
              'hey.jpg': {}}}
    

    如果可以使用字典而不是列表,那么无论如何都很容易更改。

    【讨论】:

    • @Bakuriu 我知道我可以使用代码块。问题是程序的输出不是代码,所以应该使用引用块。
    • 代码块必须用于所有必须按字面解释的文本。例如回溯和错误消息以及程序输入/输出,因为确切的内容是必不可少的。此外,如果我们遵循您的逻辑程序输出肯定不是其他人的quote,正如引用块的意图。
    • @Bakuriu 我没有找到任何指导方针。恕我直言,代码应该用于可以编译的东西,而引号用于表示不是您自己的话的任何其他文本(因此不仅是其他人的,还有文档和程序的输出)。不过我承认,撇开定义不谈,您的编辑确实提高了可读性。
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多