更新已存在的json文件python

2024-09-22 16:24:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个json文件,我想用我从远程服务器scp的文件名更新“filename”字段。我对python还很陌生,但我会边学习边学习。在

JSON文件:

{"path":"/home/Document/Python", 
"md5s":[{"filename":"",
    "md5":"",
    "timestamp":""},
   {"filename":"",
    "md5":"",
    "timestamp":""},
   {"filename":"",
    "md5":"",
    "timestamp":""}
]}

到目前为止我的python代码:

^{pr2}$

格式化在这里并不是很好,但我几乎可以肯定在我的python脚本中它是很好的。 现在的情况是,当我是来自不同服务器的三个文件时,它用同一个文件填充所有字段“filename”。在

任何帮助都会很好。谢谢。在

编辑(当添加到文件时更新的问题起作用,但它用相同的文件名填充所有值。在

预期结果:

{"path":"/home/Document/Python", 
 "md5s":[{"filename":"text1.txt",
"md5":"",
"timestamp":""},
{"filename":"text2.txt",
"md5":"",
"timestamp":""},
{"filename":"text3.txt",
"md5":"",
"timestamp":""}
 ]}

实际:

 {"path":"/home/Document/Python", 
 "md5s":[{"filename":"text1.txt",
"md5":"",
"timestamp":""},
{"filename":"text1.txt",
"md5":"",
"timestamp":""},
{"filename":"text1.txt",
"md5":"",
"timestamp":""}
 ]}}

Tags: 文件path服务器txtjsonhome远程文件名
2条回答

我已经尽可能的帮你整理代码了。我不知道您为什么得到KeyError,但是您没有按照注释中的建议实现计数器。因为我不能访问config['servers'],所以计数器可能在错误的位置,在这种情况下,将它放在for内部循环中。我在您的json字符串上测试了这一点,它确实如您预期的那样工作,因此原理是正确的,您只需确保为counter传递所需的值。在

def filemd5():
    try:
        config = json.load(open(config_file))

        counter = 0 # Add a counter here
        for server in config['servers']:
            ssh = SSHClient() 
            ssh.load_system_host_keys()

            ssh.connect(server['ip'], username=server['username'], 
                            password=server['password'])

            print('Connecting to servers')
            ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command('ls /tmp/')
            error = str(ssh_stderr.read())
            if not error: 
                for files in config['servers']: 
                    filename = file_location + server['file']
                    scp = SCPClient(ssh.get_transport())
                    scp.get(filename)
                if os.path.isfile(server['file']):
                    updateJsonFile(filename, counter)
                    counter += 1 # increment the counter
                    print(filename)
                else:
                    print('KO')
    except:
        # I don't understand why you don't get an error for missing except?
        pass  

def updateJsonFile(filename, counter):
    with open('md5.json', 'r') as f:
        data = json.load(f)

    subdata = data['md5s']
    # The code below would update every value since you loop through whole list
    #for check in subdata:
    #   check["filename"] = filename
    subdata[counter]['filename'] = filename

    with open('md5.json', 'w') as f:
        f.write(json.dumps(data))

如果我理解正确的话,您可以从一个json文件开始,其中包含对文件的引用列表,并且您希望更新列表的下一个元素。在

您可以浏览data['md5s']搜索filename字段为空的第一个元素,并在所有操作都已完成的情况下向列表中添加新的措辞:

def updateJsonFile(filename):
    jsonFile = open("md5.json", "r")  # load data from disk
    data = json.load(jsonFile)
    jsonFile.close()

    for tmp in data["md5s"]:  # browse the list
        if len(tmp['filename']) == 0:  # found one empty slot, use it and exit looop
            tmp['filename'] = filename
            break
    else:     # no empty slot found: add a new dict
        data["md5s"].append({'md5': '', 'timestamp': '', 'filename': filename})
    jsonFile = open("m.json", "w")  # write the json back to file
    json.dump(data, jsonFile)
    jsonFile.close()

相关问题 更多 >