用Python将值插入到json文件中的特定位置

问题描述:

试图找到一种优雅的方式将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对象” - 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对象”列表;) –