python - 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) 机器的远程连接。感谢任何帮助。
提前致谢。
解决方案
如果要第二次读取文件,则必须将文件读取指针寻回文件开头:
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)
推荐阅读
- python - 如何在 python 中重构这样的多头数据帧?
- python - 为什么通过 OpenCV (Python) 的视频输出如此缓慢(逐帧)?
- kubernetes - Websocket 不适用于 nginx-ingress 上的基本身份验证
- php - PHP:为什么真等于-1?
- ajax - 由于 cors,来自 ajax 的 jsonp 解析错误,但 safari (14) 仍然在错误控制台中显示正确结果
- node.js - Discord JS 命令不发送/响应命令
- c++ - C++ 类模板:“从这里需要”错误
- python - 如何为条形图注释创建可变字体大小
- javascript - Uncaught (in promise) SyntaxError: Unexpected end of JSON input in the code below
- nginx - 重定向到 nginx 中的特定目录