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

时间:2015-09-28 13:42:59

标签: python json list object insert

尝试找到一种优雅的方法,将文件名从os.walk()循环插入到特定的子元素中(因为缺少更好的术语)将在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让我失望(或者我可能没有正确使用它们),并进行过于复杂的正则表达式搜索-n- <{1}}元素的replace-copy-n-paste操作感觉......脏了。

我意识到在将整个内容输出到JSON文件之前,无论如何我都可能会这样做。我非常感谢您能吸收的任何想法,提示或解决方案示例!

1 个答案:

答案 0 :(得分:1)

没有&#34; json对象&#34; - json只是一种序列化/反序列化常见数据类型(字符串,nums,数组和关联数组)的方法。你在Python代码中拥有的只是Python对象,在你的例子中是一个包含dicts的列表(名为JsonObject),它们本身包含列表和dicts,除了普通的基本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)
         },
      })