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

标签 python json list object insert

试图找到一种优雅的方式将来自 os.walk() 循环的文件名插入到将输出为 JSON 文件的 Python 对象。如果这没有多大意义,这里是我到目前为止拼凑的一些视觉输出。

使用的代码:

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 元素做一个过于复杂的正则表达式 search-n-replace-copy-n-paste 操作感觉......不知何故很脏。

我意识到,在将整个内容输出到 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)
         },
      })

关于python - 使用 Python 将值插入到 json 文件中的特定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32824603/

相关文章:

python - 导入错误 : PyCapsule_Import could not import module "pyexpat"

python - 重新格式化嵌套的元组列表时出现问题?

python - 给定一个包含多个元素的列表,如何获得完美三元组的数量?

c# - 通过 WebClient 上传 JSON

java - php解析json到android时显示空

python - 列表中的重复元组

python - 如何重新排列/重新排序(不一定排序) Pandas 数据帧索引?

python - 建立一个电子邮件客户端有多难? - Python

python - 从python中的unicode字符串获取字节

python - 使用 Python 将 JSON 数据漂亮地打印到文件中