Python 玩 SFTP,如何实现断点续传?
用 paramiko.没发现有这样的功能啊。有达人能指点下么?
冰天雪地裸奔跪求。
Python 玩 SFTP,如何实现断点续传?
1 回复
核心思路: 用 paramiko 的 SFTPClient.get 方法,配合 localpath 的 'ab' 追加写入模式和 callback 回调跳过已下载部分。
关键代码示例:
import os
import paramiko
from paramiko import SSHClient, AutoAddPolicy
def sftp_resume_download(host, port, username, password, remote_path, local_path):
"""SFTP断点续传下载函数"""
ssh = SSHClient()
ssh.set_missing_host_key_policy(AutoAddPolicy())
try:
ssh.connect(host, port, username, password)
sftp = ssh.open_sftp()
# 获取远程文件大小
remote_size = sftp.stat(remote_path).st_size
# 获取本地已下载大小(如果文件存在)
local_size = os.path.getsize(local_path) if os.path.exists(local_path) else 0
# 如果本地文件已完整,直接返回
if local_size == remote_size:
print(f"文件已完整下载: {local_path}")
return
# 以追加二进制模式打开本地文件
with open(local_path, 'ab') as f:
# 定义回调函数来显示进度
def callback(transferred, total):
percent = (local_size + transferred) / remote_size * 100
print(f"\r下载进度: {percent:.1f}%", end='')
# 关键:从断点位置开始下载
sftp.get(remote_path, f,
callback=callback if local_size > 0 else None)
print(f"\n下载完成: {local_path}")
finally:
sftp.close() if 'sftp' in locals() else None
ssh.close()
# 使用示例
sftp_resume_download(
host='your_host',
port=22,
username='your_user',
password='your_pass',
remote_path='/remote/path/file.zip',
local_path='./local_file.zip'
)
要点说明:
'ab'模式确保在已有文件末尾追加数据os.path.getsize()获取已下载大小作为断点位置- 实际下载时 paramiko 会自动从文件末尾继续传输
一句话建议: 用追加写入模式配合本地文件大小检测就能实现基础断点续传。

