本文Python Code基于chatGPT的推荐,并修改调试实际运行通过,供学习参考。
通过使用python paramiko库,实现文件传输,包括上传和下载,并且同步显示上传和下载进度条信息,实时获取传输进度,避免print方式频繁刷屏困扰:Python paramiko文件传输显示上传下载进度信息 - print_Entropy-Go的博客-CSDN博客。
import sys
import os
import time
import paramiko
def download_file_with_progress(hostname, username, password, remote_path, local_path):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, username=username, password=password)
sftp = ssh.open_sftp()
# get remote file size
remote_file_size = sftp.stat(remote_path).st_size
print ("remote_file_size:{}".format(remote_file_size))
with open(local_path, 'wb') as f:
# show download progress
def progress_bar(transferred, remote_file_size, suffix=''):
bar_len = 100
filled_len = int(round(bar_len * transferred / float(remote_file_size)))
percents = round(100.0 * transferred / float(remote_file_size), 1)
bar_filled = '\033[32;1m%s\033[0m' % '*' * filled_len
bar = bar_filled + '-' * (bar_len - filled_len)
sys.stdout.write('[%s] %s%s %s\r' % (bar, '\033[32;1m%s\033[0m' % percents, '%', suffix))
sys.stdout.flush()
# transfer 32768 bytes as SSH slice, get remote file to local
sftp.getfo(remote_path, f, callback=progress_bar)
sys.stdout.write('\n')
sftp.close()
ssh.close()
def upload_file_with_progress(hostname, username, password, remote_path, local_path):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, username=username, password=password)
sftp = ssh.open_sftp()
# get file size
local_file_size = os.stat(local_path).st_size
print ("local_file_size:{}".format(local_file_size))
with open(local_path, 'rb') as f:
# show upload progress
def progress_bar(transferred, local_file_size, suffix=''):
bar_len = 100
filled_len = int(round(bar_len * transferred / float(local_file_size)))
percents = round(100.0 * transferred / float(local_file_size), 1)
bar_filled = '\033[32;1m%s\033[0m' % '*' * filled_len
bar = bar_filled + '-' * (bar_len - filled_len)
sys.stdout.write('[%s] %s%s %s\r' % (bar, '\033[32;1m%s\033[0m' % percents, '%', suffix))
sys.stdout.flush()
# transfer 32768 bytes as SSH slice, put local file to remote
sftp.putfo(f, remote_path, local_file_size, callback=progress_bar)
sys.stdout.write('\n')
sftp.close()
ssh.close()
if __name__ == "__main__":
hostname = "host_IP"
username = "host_username"
password = "host_password"
remote_path = "~/file"
local_path = "./file.download"
remote_path_upload = "~/file.upload"
local_path_upload = "./file"
# download file and calculate cost
print ("Download Start, 32678 bytes as default SSH slice: ")
download_start = time.time()
download_file_with_progress(hostname, username, password, remote_path, local_path)
download_end = time.time()
download_cost = download_end - download_start
print ("Download successfully! Cost {}s".format(download_cost))
cutline = '\033[32;1m%s\033[0m' % '=' * 100
print (cutline)
# upload file and calculate cost
print ("Upload Start, 32678 bytes as default SSH slice: ")
upload_start = time.time()
upload_file_with_progress(hostname, username, password, remote_path_upload, local_path_upload)
upload_end = time.time()
upload_cost = upload_end - upload_start
print ("Upload successfully! Cost {}s".format(upload_cost))
传输完成输出:
$ python download_upload_big_file_progress_bar.py
Download Start, 32678 bytes as default SSH slice:
remote_file_size:63376366
[****************************************************************************************************] 100.0%
Download successfully! Cost 2.7611076831817627s
====================================================================================================
Upload Start, 32678 bytes as default SSH slice:
local_file_size:63376366
[****************************************************************************************************] 100.0%
Upload successfully! Cost 2.147914171218872s
传输中截图:
传输完成截图:
参考:
Python paramiko文件传输显示上传下载进度信息 - print_Entropy-Go的博客-CSDN博客
Python paramiko实现文件的简单传输上传和下载代码_Entropy-Go的博客-CSDN博客
下一步计划对比不同的文件传输方式及优缺点:单进程,多进程,以及多线程的文件传输