【问题标题】:Python json.load returning string instead of dictionaryPython json.load 返回字符串而不是字典
【发布时间】:2016-07-13 20:34:29
【问题描述】:

我正在接收一个 json 文件,并且只将必要的键及其值复制到一个新的 json 文件中。关于将值复制到 myDict 的位置,我收到错误“TypeError:字符串索引必须是整数”。据我所知, json.load 返回的是字符串而不是字典。我验证了 json 文件,它具有有效的 json 格式。我正在使用 Python 2.7.12。我到处搜索,但没有找到回答我的具体问题的答案。非常感谢您能给我的任何帮助。

import os
import sys
import json

def stripSpec(inp, outp):
    #Load json file as python dictionary
    obj  = json.load(open(inp, "r"))

    result=[]

    #Go through JSON and save necessary keys and values
    for i in obj:
        myDict = {}
        myDict["id"]=i.get('id').get('value')
        myDict["data"]["BaselineExposure"]=i.get('data').get('BaselineExposure').get('value')
        myDict["data"]["ColorMatrix2"]=i.get('data').get('ColorMatrix2').get('value')
        result.append(myDict)

    # Output the updated file with pretty JSON
    open(outp, "w").write(json.dumps(result, sort_keys=True, indent=4, ensure_ascii=False, separators=(',', ':')))
    return

#Save input and output paths as variables
inp = sys.argv[1]
outp = sys.argv[2]

#Call function
stripSpec(inp, outp)

这里是 json 的一个示例。它已大大减少,但基本上每个相机型号都有更多条目

[
{ "id": "Canon EOS 100D",
 "data":[{
  "SourceFile": "./Canon 100D/canon_eos_100d_11.dng",
  "ExifToolVersion": 10.07,
  "Directory": "./Canon 100D",
  "FileSize": "18 MB",
  "FileModifyDate": "2016:05:02 23:03:14-07:00",
  "FileAccessDate": "2016:05:03 01:45:03-07:00",
  "FileInodeChangeDate": "2016:05:02 23:03:14-07:00",
  "FilePermissions": "rw-r--r--",
  "ColorMatrix2": "0.6602 -0.0841 -0.0939 -0.4472 1.2458 0.2247 -0.0975 0.2039 0.6148",
  "CameraCalibration1": "1.0648 0 0 0 1 0 0 0 0.9881",
  "CameraCalibration2": "1.0648 0 0 0 1 0 0 0 0.9881",
  "AnalogBalance": "1 1 1",
  "AsShotNeutral": "0.512769 1 0.584809",
  "BaselineExposure": -0.25,
  "RedBalance": 1.950195
  }]
},

【问题讨论】:

    标签: python json


    【解决方案1】:

    在您的 json 存根 "data" 键中包含列表。在您的代码中,您将其称为字典:i.get('data').get('BaselineExposure')

    相反,您应该遍历您的 "data"。 例如:

    data = i.get('data')
    for d in data:
        print(d.get('BaselineExposure'))
    

    所以基本上要小心嵌套项。

    还有你为什么使用i.get('id').get('value')。相反,i.get('id') 应该足够了,额外的.get('value') 应该提高AttributeError,不是吗?

    【讨论】:

      【解决方案2】:

      概述:我假设 json 存储为字典。我使用 json.dumps 将字典转换为 json 字符串。我 pip install json2xml json2xml 来转换 json 字符串,以便它可以转换为 xml。然后我将 xml 加载到 dom 树中进行搜索。我使用 getElementsByTagName 在 xml 树中搜索节点并显示该值。我的方法对程序员更友好。

      from json2xml import json2xml
      from json2xml.utils import readfromurl, readfromstring, readfromjson
      from xml.dom.minidom import parse, parseString
      
      dict={
        "id": "Canon EOS 100D",
        "data": [{
          "SourceFile": "./Canon 100D/canon_eos_100d_11.dng",
          "ExifToolVersion": 10.07,
          "Directory": "./Canon 100D",
          "FileSize": "18 MB",
          "FileModifyDate": "2016:05:02 23:03:14-07:00",
          "FileAccessDate": "2016:05:03 01:45:03-07:00",
          "FileInodeChangeDate": "2016:05:02 23:03:14-07:00",
          "FilePermissions": "rw-r--r--",
          "ColorMatrix2": "0.6602 -0.0841 -0.0939 -0.4472 1.2458 0.2247 -0.0975 0.2039 0.6148",
          "CameraCalibration1": "1.0648 0 0 0 1 0 0 0 0.9881",
          "CameraCalibration2": "1.0648 0 0 0 1 0 0 0 0.9881",
          "AnalogBalance": "1 1 1",
          "AsShotNeutral": "0.512769 1 0.584809",
          "BaselineExposure": -0.25,
          "RedBalance": 1.950195
          }]
       }
      
       #convert dictionary to a string
       json_data=json.dumps(dict,indent=4)
       data=readfromstring(json_data)
       xml=json2xml.Json2xml(data).to_xml()
      
       dom=parseString(xml)
      
       element=dom.getElementsByTagName('BaselineExposure') 
       print(element[0].firstChild.nodeValue)
      

      【讨论】:

      • 否则手动搜索: def printDictionary(dict,leafNode): for j in dict.keys(): if j==leafNode: print("Found " + j+':',dict[j] ) else: print(j+':',dict[j]) leafNode="BaselineExposure" for key in dict.keys(): #print(type(dict[key])) if str(type(dict[key]) )=="": listItems=dict[key] for item in listItems: if str(type(item))=="": printDictionary(item,leafNode) else: print(key+':',dict[key])
      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 2015-12-19
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2018-11-01
      • 2023-03-19
      相关资源
      最近更新 更多