Python:从python shell命令替换json文件中的字符串

时间:2015-08-31 13:01:49

标签: python json shell

我是python的新手,我尝试做的是用python os shell命令替换json文件中的text / string。我有点得到了我正在寻找的结果,但是它在json文件中附加了额外的空格/创建了一个新行。这基本上就是我想要完成的事情:

  1. 我有一个静态json文件(add.json)
  2. 我在python中运行两个OS shell命令,并将该输出存储到单独的文本文件中。
  3. 然后我想要获取这两个txt文件中的值,并替换 json文件中的两个字符串。
  4. 以下是我目前所拥有的(为了简单起见,我用简单的命令替换了真正的aws cli命令)

    import os
    import fileinput
    
    cmd = 'hostname > host.txt'
    cmd2 = 'echo mama > echo.txt'
    
    os.system(cmd)
    os.system(cmd2)
    
    file = open('host.txt')
    contents = file.read()
    with open("out.json", "wt") as fout:
    with open("add.json", "rt") as fin:
        for line in fin:
            fout.write(line.replace('dns',contents))
    
    file2 = open('echo.txt')
    contents2 = file2.read()
    with open("out2.json", "wt") as fout2:
        with open("out.json", "rt") as fin2:
        for line in fin2:
            fout2.write(line.replace('ip', contents2))
    

    这就是它产生的结果:

    {
    "Comment": "A new record set for the zone.",
    "Changes": [
     {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "WildburritoPC
     ",
        "Type": "A",
        "TTL": 60,
        "ResourceRecords": [
          {
            "Value": "mama 
    "
          }
         ]
       }
      }
     ]
    }
    

    正如您所看到的,在Name和Value之后,它确实替换了值,但添加了一个新行并生成了无效的json。

    这是我替换以下值的文件:

    {
    "Comment": "A new record set for the zone.",
    "Changes": [
     {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "dns",
        "Type": "A",
        "TTL": 60,
        "ResourceRecords": [
          {
            "Value": "ip"
          }
        ]
       }
      }
     ]
    }
    

    提前感谢您的任何答案。我知道我上面的东西非常脏,而且我确信必须有更好/更清洁的方式来完成我想要做的事情,但最终我知道我们都必须从某个地方开始我可以&甚至开始解释我对这个社区的感激之情,感谢他们迄今提供的所有帮助。

2 个答案:

答案 0 :(得分:2)

python的标准库中有json个模块,使用它而不是替换字符串会更加错误。

加载json文件:

import json
with open("add.json", "r") as fout2:
    json_data = json.load(fout2)
    for change in json_data["Changes"]:
        # strip the contents of trailing white spaces (new line)
        change["Name"] = change["Name"].strip()

# dump json to another file
with open("out.json", "w") as fout:
    fout.write(json.dumps(json_data))

我猜你有这个主意。 json模块会注意你的json数据没有被破坏(或者至少它会在发生这种情况时失败并且异常)。

答案 1 :(得分:1)

只需将该文件作为普通文本文件打开并替换您想要的字符串

with open('file.json', 'r+') as file:
    content = file.read()
    file.seek(0)
    content.replace('string_replaced', 'new_string')
    file.write(content)

由于你想在任何地方替换字符串,数据是否为json无关紧要