Python paramiko文件传输显示上传下载进度条源码 - stdout

本文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博客 

下一步计划对比不同的文件传输方式及优缺点:单进程,多进程,以及多线程的文件传输

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值