SFTP服务器文件移动问题:能否使用Paramiko替代shutil实现相关操作?
SFTP文件移动需求的Paramiko实现说明
完全可以通过Paramiko实现你的需求。
shutil、os模块仅支持操作本地挂载的文件系统,SFTP属于远程网络文件协议,没有本地映射挂载的情况下本地IO类库无法直接识别路径,而Paramiko作为Python实现的SSH协议工具库,原生内置了SFTP客户端组件,完全支持SFTP服务器上的文件查询、重命名、传输、删除等操作。
常规实现逻辑
- 同SFTP服务器内部移动文件:不需要跨网络传输数据,直接调用SFTP客户端的重命名方法即可完成移动+加时间戳的操作,执行效率很高。
- 跨SFTP服务器/脚本运行服务器与SFTP服务器之间移动:需要先将源文件下载到脚本运行的服务器临时目录,拼接好带时间戳的新文件名后再上传到目标路径,最后删除两端的源文件即可。
参考代码示例
import paramiko from datetime import datetime # 初始化SSH客户端并配置自动接受未知主机密钥 ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接SFTP服务器,密钥认证可替换password参数为key_filename='私钥文件路径' ssh_client.connect( hostname="SFTP服务器地址", port=22, username="登录账号", password="登录密码" ) sftp_client = ssh_client.open_sftp() # 配置源路径和目标目录 source_file_path = "/源目录/待移动文件.csv" target_directory = "/目标目录/" # 生成带时间戳的新文件名 raw_filename = source_file_path.split("/")[-1] if "." in raw_filename: name_suffix, name_prefix = raw_filename.rsplit(".", 1) new_filename = f"{name_suffix}_{datetime.now().strftime('%Y%m%d%H%M%S')}.{name_prefix}" else: new_filename = f"{raw_filename}_{datetime.now().strftime('%Y%m%d%H%M%S')}" target_file_path = f"{target_directory}{new_filename}" # 同SFTP服务器内部直接移动文件 sftp_client.rename(source_file_path, target_file_path) # 关闭连接 sftp_client.close() ssh_client.close()
注意事项
- 执行移动操作前可以先调用
sftp_client.stat(target_file_path)捕获异常判断目标路径是否存在,避免意外覆盖已有文件。 - 大文件跨服务器传输的场景建议添加断点续传逻辑,避免网络波动导致操作失败。
内容的提问来源于stack exchange,提问作者Arvind B
相关产品推荐
相关产品推荐

