【问题标题】:Inserting values into specific locations in a json file with Python使用 Python 将值插入到 json 文件中的特定位置
【发布时间】:2015-12-25 18:58:03
【问题描述】:

试图找到一种优雅的方式将文件名从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 在这一点上让我失望(或者我可能没有正确使用它们),并且执行了一个过于复杂的正则表达式 search-n-replace-copy-n- sounds 元素的粘贴操作感觉...有点脏。

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

【问题讨论】:

    标签: python json list object insert


    【解决方案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)
             },
          })
    

    【讨论】:

    • 为了记录,我确实写了“......一个将作为 JSON 文件输出的 Python 对象......”但我可以看到在代码中使用 jsonObject 是多么令人困惑。事实上,我在这里将术语与错误的名称混合在一起。有趣的是,我有“jsonList”,在修修补补时,出于某种未知原因,我将其更改为“jsonObject”。可能是什么让我想到了使用 .append/.insert 等等的错误轨道。一旦我看到您对 list() 的使用,它就变成了“呃,这当然是我需要的”。谢谢你的大脑嘎嘎作响,布鲁诺!
    • FWIW 在 Python 2.x 中甚至不需要对 list(files) 的调用,因为它已经是 list - 但它可能(或不是)在 Python 3.x 中是另一种可迭代的,并且不想浪费时间检查文档...
    • 哦,是的,通常“json 对象”是用于关联数组的 json 表示的术语(基本上是 Python dict 或纯 JavaScript object)。在您的代码中,一旦转储到 json,您将拥有一个“json 对象”列表;)
    • 明白。在较早的、更扁平的 JSON 输出版本中,我只使用了列表的名称,它的工作原理与宣传的一样。如果我这么容易被难住,显然是时候从电脑上休息一下了。再次感谢! (为了清楚起见,我是否应该编辑我的问题以将 jsonObject 更改为 jsonList?)
    • 已修复问题以更好地反映内容
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多