試圖找到一種優雅的方式將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文件中。任何想法,提示,或解決方案的例子,我可以吸收將不勝感激!
爲了記錄,我確實寫了「...一個將作爲JSON文件輸出的Python對象...」,但我可以看到如何在代碼中使用jsonObject令人困惑。事實上,我把這裏的術語與不好的名字混合在一起。有趣的是,我有'jsonList',並且在修補程序的某個時候,我將其更改爲'jsonObject',原因不明。可能是什麼讓我想到了使用.append/.insert等錯誤的軌道。一旦我看到你使用list(),它就變成了「呃,當然這就是我需要的」。謝謝你的大腦咔嚓聲,布魯諾! –
在Python 2.x中,調用「list(files)」甚至不是必需的,因爲它已經是一個'list'了 - 但它可能(或不是)是Python 3.x中的另一種迭代,並且不想浪費時間檢查文檔... –
哦,是的,通常「json對象」是用於關聯數組(基本上是Python'dict'或純javascript對象')的json表示的術語。在你的代碼中,一旦拋棄到json,你會得到一個「json對象」列表;) –