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