2017-02-03 73 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

相關問題