2017-02-18 61 views
2

我有一個嵌套的字典是這樣的:從嵌套的dict |創建文件樹Python 2.7版

Main = { 
    'root' : { 
     'object': 'data' 
     'users': { 
      'otherobj': 'data' 
     } 
    } 
} 
  • 我需要從它在本地目錄/tree/其中每個字典的名稱爲文件夾的名稱創建一個文件樹
  • 每個字典中的所有值都屬於它
  • 所有不是字典的值都被忽略。 (我會分開處理)
  • 樹的深度將是未知的。
  • 每個目錄可以(通常會)有多個子目錄。
+0

@ZdaR一手滿是谷歌的虛假魔術,根本沒有幫助我。真相是我不知道該怎麼嘗試。這就是我來這裏的原因。 – Cyanite

+1

操作文件和目錄的有用函數在'os','os.path'和'shutil'模塊中。你可以使用遞歸函數來遍歷你的字典。 –

回答

0

如果我理解正確,你想要的東西,如以下落得:

  • root/objectdata
  • root/users/otherobjdata

所以讓我們來破解這個有點。基本上,您需要做兩件事情的能力:

  • 決定在你的字典鍵的值是否爲「數據」,或給予一定的數據的另一種解釋
  • ,它與給定的路徑寫入到一個文件

我將它留給你寫這些功能,但我認爲它們具有以下特徵:

  • def is_data(obj)返回True/False(這可能是not isinstanceof(obj, dict),除非你的數據對象可能是一些特殊的屬性類型的字典)
  • def write_data(directory, filename, obj)

在這一點上,我們已經準備好寫遍歷樹的功能。我假設你將第一個關鍵字和字典從Main中取出。對於每個(鍵,值)對,我們需要檢查值是「數據」還是另一個字典。如果是數據,寫出來。如果是另一個字典,我們將密鑰添加到我們的路徑中,並撥打字典。

def walk(root_directory, obj_dict): 
    for k, v in obj_dict.iteritems(): 
     if is_data(v): 
      # write the file 
      write_data(root_directory, k, v) 
     else: # it's another dict, so recurse 
      # add the key to the path 
      new_root = os.path.join(root_directory, k) # you'll need to import os 
      walk(new_root, v) 
+0

如果字典中的對象不是字典的(例如:''something':'那不是字典'),它需要被忽略。 – Cyanite

+0

其實我可以在這裏表達。但是如果dict中沒有文件存在,這會創建目錄嗎? – Cyanite

+0

(由此,我的意思是忽略我的第一條評論) – Cyanite

0

此代碼片段應該有所幫助。這裏我假設python腳本將在目標本地目錄中運行。

import os 

# dir_definition = <your 'Main'> 

def create_dirs(dir_definition): 
    for dir_dame, sub_dir in dir_definition.items(): 
     os.mkdir(dir_dame) 
     if isinstance(sub_dir, dict): 
      create_dirs(sub_dir) 
+1

問題的確在乞求遞歸解決方案。 – Elmex80s