2017-02-03 70 views
0

而不是使用真正的文件结构,是否可以给它一个预制的字符串列表,让它为您创建一个嵌套的路径/文件列表?可以在字符串列表上使用os.walk()吗?如果不是,那么等效的是什么?

示例表(格式,因此它的可读性):

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()对于我想要的是理想的,但在我看来,似乎人们都是使用它来抓取文件系统,而不是传递一个已经创建的文件路径的列表。

回答

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': {}}} 

如果它的一切权利有类型的字典而不是列表,方便反正改变。

+0

@Bakuriu我知道我可以使用代码块。问题是程序的输出不是代码,所以应该使用报价块。 – BartoszKP

+0

Nah,Bakuriu是对的。 –

+0

代码块必须用于所有必须按字面解释的文本。例如回溯和错误消息以及程序输入/输出,因为确切的内容是必不可少的。此外,如果我们遵循你的逻辑程序,输出结果肯定不是其他人的报价**,正如预期的报价块一样。 – Bakuriu

相关问题