Paramiko下载,处理并重新上传同一文件

时间:2018-11-11 19:09:12

标签: python sftp paramiko

我正在使用Paramiko创建SFTP客户端,以创建JSON文件的备份副本,读入原始文件的内容,然后进行更新(原始文件)。我可以使此代码段正常工作:

# open sftp connection stuff

# read in json create backup copy - but have to 'open' twice
read_file = sftp_client.open(file_path)
settings = json.load(read_file)
read_file = sftp_client.open(file_path)  
sftp_client.putfo(read_file, backup_path)

# json stuff and updating
new_settings = json.dumps(settings, indent=4, sort_keys = True)

# update remote json file
with sftp_client.open(file_path, 'w') as f:
    f.write(new_settings)

但是,当我尝试清理代码并将备份文件创建和JSON负载结合在一起时:

with sftp_client.open(file_path) as f:
    sftp_client.putfo(f, backup_path)    
    settings = json.load(f)

将创建备份文件,但是json.load将由于没有任何内容而失败。而且,如果我颠倒顺序,json.load将读取值,但是备份副本将为空。

我在Windows机器上使用Python 2.7,创建到QNX(Linux)机器的远程连接。感谢任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果要第二次读取文件,则必须查找文件读取指针,使其回到文件开头:

with sftp_client.open(file_path) as f:
    sftp_client.putfo(f, backup_path)    
    f.seek(0, 0)
    settings = json.load(f)

尽管在功能上等同于带有两个open的原始代码。


如果您希望优化代码,以避免两次下载文件,则必须将文件读取/缓存到内存中,然后从缓存中上载并加载内容。

f = BytesIO()
sftp_client.getfo(file_path, f)
f.seek(0, 0)
sftp_client.putfo(f, backup_path)    
f.seek(0, 0)
settings = json.load(f)