2015-09-28 172 views
2

試圖找到一種優雅的方式將os.walk()循環中的文件名插入到特定的子元素(對於更好的術語來說)輸出爲JSON文件。如果這沒有多大意義,這裏有一些我迄今爲止拼湊在一起的視覺輸出。使用用Python將值插入到json文件中的特定位置

代碼:

import os 
from os.path import normpath, basename 
import json 

ROOT_PATH = "sounds/" 
jsonObject = [] 

for path, subdirs, files in os.walk(ROOT_PATH): 
    if files: 
     elementId = basename(normpath(path)) + "Audio" # <-- builds custom Id based on path 
     jsonObject.append({ "elementId" : elementId, "params" : { "audioPath" : path, "sounds" : [] } }) 
     for name in files: 
     jsonObject.append(name) # <-- problem lies here... 

with open('sounds/Elements.json', 'w') as outfile: 
    json.dump(jsonObject, outfile, indent=3, ensure_ascii=False, sort_keys=True) 

...主要生產:

[ 
    { 
     "elementId": "soundsAudio", 
     "params": { 
     "audioPath": "sounds/", 
     "sounds": [] 
     } 
    }, 
    "beep2.mp3", 
    "heart_rate_flatline.mp3", 
    "shhh.mp3", 
    { 
     "elementId": "aha_aedAudio", 
     "params": { 
     "audioPath": "sounds/aha_aed", 
     "sounds": [] 
     } 
    }, 
    "AnalyzingHeartRhythm.mp3", 
    "AttachPadsToPatientsBareChest.mp3", 
    "BeginCPR.mp3", 
    "Charging.mp3", 
    "DoNotTouchThePatient.mp3" 
] 

...這是真的密切。但我碰到的腦塊得到的mp3文件列表sounds部分,所以它看起來是這樣的:

[ 
    { 
     "elementId": "soundsAudio", 
     "params": { 
     "audioPath": "sounds/", 
     "sounds": [ "beep2.mp3", 
        "heart_rate_flatline.mp3", 
        "shhh.mp3" 
     ] 
     } 
    }, 
    { 
     "elementId": "aha_aedAudio", 
     "params": { 
     "audioPath": "sounds/aha_aed", 
     "sounds": [ "AnalyzingHeartRhythm.mp3", 
        "AttachPadsToPatientsBareChest.mp3", 
        "BeginCPR.mp3", 
        "Charging.mp3", 
        "DoNotTouchThePatient.mp3" 
     ] 
     } 
    } 
] 

.append.extend.insert都讓我失望在這一點(或者可能我沒有正確使用它們),並且爲sounds元素執行過於複雜的正則表達式搜索-n-替換 - 複製 - 粘貼操作感覺......不知何故。

我意識到我可能會無奈地將這件事情輸出到JSON文件中。任何想法,提示,或解決方案的例子,我可以吸收將不勝感激!

回答

1

有沒有這樣的事情作爲「json對象」 - json只是一種序列化/反序列化常見數據類型(字符串,數字,數組和關聯數組)。你所有的Python代碼都是Python對象,在你的情況下,列表(名爲JsonObject)包含本身包含列表和字典的字典,這裏除了普通的基本Python數據類型外,在這裏沒什麼特別的。

當然,您的jsonObject列表中的列表方法都不會在此處有任何用處,因爲要存儲文件列表的對象是您剛添加到列表中的字典,而不是列表本身。

解決的辦法是顯而易見的:在文件列表(或者)之前剛剛添加到您的元素你把它添加到你的主目錄,即:

if files: 
    elementId = basename(normpath(path)) + "Audio" 
    element = { 
     "elementId" : elementId, 
     "params" : { 
     "audioPath" : path, 
     "sounds" : list(files) 
     }, 
     } 
    jsonObject.append(element) 

或者更簡單地說:

if files: 
    elementId = basename(normpath(path)) + "Audio" 
    jsonObject.append({ 
     "elementId" : elementId, 
     "params" : { 
     "audioPath" : path, 
     "sounds" : list(files) 
     }, 
     }) 
+0

爲了記錄,我確實寫了「...一個將作爲JSON文件輸出的Python對象...」,但我可以看到如何在代碼中使用jsonObject令人困惑。事實上,我把這裏的術語與不好的名字混合在一起。有趣的是,我有'jsonList',並且在修補程序的某個時候,我將其更改爲'jsonObject',原因不明。可能是什麼讓我想到了使用.append/.insert等錯誤的軌道。一旦我看到你使用list(),它就變成了「呃,當然這就是我需要的」。謝謝你的大腦咔嚓聲,布魯諾! –

+1

在Python 2.x中,調用「list(files)」甚至不是必需的,因爲它已經是一個'list'了 - 但它可能(或不是)是Python 3.x中的另一種迭代,並且不想浪費時間檢查文檔... –

+1

哦,是的,通常「json對象」是用於關聯數組(基本上是Python'dict'或純javascript對象')的json表示的術語。在你的代碼中,一旦拋棄到json,你會得到一個「json對象」列表;) –

相關問題