【问题标题】:Remove specific JSON oobjects from a File and then store this file从文件中删除特定的 JSON 对象,然后存储此文件
【发布时间】:2015-09-21 21:39:07
【问题描述】:

这只是我的 json 文件的一部分,看起来像:

"network_lo": "127.0.0.0",
    "ec2_block_device_mapping_root": "/dev/sda1",
    "selinux": "false",
    "uptime_seconds": 127412,
    "ec2_reservation_id": "r-cd786568",
    "sshdsakey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "ec2_block_device_mapping_ami": "/dev/sda1",
    "memorysize": "3.66 GB",
    "swapsize": "0.00 kB",
    "netmask": "255.255.255.192",
    "uniqueid": "24wq0see",
    "kernelmajversion": "3.2",

我有一个 Python scipt 可以下载这个文件。我想解析这个文件并删除一些对象,比如“swapsize”、“sshdsakey”

sqs = boto.sqs.connect_to_region("ap-west-1")
q = sqs.get_queue("deathvally")
m = q.read(visibility_timeout=15)
if m == None:
  print "No message!"
else:
  with open('download.json', 'w') as json_data:
    print m.get_body()
    json_data.write(m.get_body())
    json_data.close()

    # I want a logic here which can simply delete the specific json objects
    # Something like this is what i tried but didn't work...
    #    clean_data = json.load(json_data)   
    #    for element in clean_data:         ##
    #      del element['sshdsakey'] 
    #      json_data.write(clean_data)

我基本上需要解析获取的 json 文件,然后删除特定对象,然后将这些新修改的内容写入文件。

【问题讨论】:

标签: python json boto


【解决方案1】:

json.loads 会将 JSON 字符串解码为 Python 字典(虽然您提供的格式不是有效的 JSON 格式,但两边必须有花括号),然后您可以使用 del 删除所需的键,编码字典用json.dumps返回JSON字符串并写入结果

clean_data = json.loads(json_data.read())
del clean_data[your_key]
with open(your_file_to_write, 'w') as f:
  f.write(json.dumps(clean_data))  

【讨论】:

    【解决方案2】:

    您可以使用原生 json 模块中的 loads 解析您的 json。 然后使用del从字典中删除一个元素

    import json
    
    keys_to_remove = ['sshdsakey', 'selinux']
    
    json_str = '''{
        "network_lo": "127.0.0.0",
        "ec2_block_device_mapping_root": "/dev/sda1",
        "selinux": "false",
        "uptime_seconds": 127412,
        "ec2_reservation_id": "r-cd786568",
        "sshdsakey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }'''
    
    data = json.loads(json_str)
    for key in keys_to_remove:
        if key in data:
            del data[key]
    print data
    

    【讨论】:

    • 它抛出:TypeError: 'str' object does not support item删除
    • @Killercrock 这个答案一开始是错误的,有 json.dumps 需要 json.loads
    • 好吧..它仍然说“关键错误”我将它作为 data = json.loads(m.get_body()) del data['selinux'] KeyError: 'selinux'
    • 您可以在删除之前检查密钥是否存在,我编辑我的答案以显示它。
    【解决方案3】:

    您需要先将 JSON 对象字符串转换为 Python dict,从中删除键,然后写入输出文件。

    import json
    
    sqs = boto.sqs.connect_to_region("ap-west-1")
    q = sqs.get_queue("deathvally")
    m = q.read(visibility_timeout=15)
    if m is None:
        print "No message!"
    else:
        KEYS_TO_REMOVE = "swapsize", "sshdsakey", "etc"
    
        with open('download.json', 'w') as json_data:
            json_obj = json.loads(m.get_body())
            for key in KEYS_TO_REMOVE:
                try:
                    del json_obj[key]
                except KeyError:
                    pass
            json_data.write(json.dumps(json_obj, indent=4))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-25
      • 2010-11-11
      • 2021-02-25
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多