在Python中显示FTP下载进度(ProgressBar) [英] Show FTP download progress in Python (ProgressBar)

查看:744
本文介绍了在Python中显示FTP下载进度(ProgressBar)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下Python脚本通过FTP下载文件。我想要的是在下载时查看进度的详细信息。为此,我使用了 ProgressBar ,但未显示任何内容。

I am downloading files over FTP using the following Python script. What I wanted is to see the details of the progress while downloading. For that I used ProgressBar but it isn't showing anything.

这是我的代码:

import re
import os
import ftplib
import ntpath

import sys
import time

from progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \
    AdaptiveETA, FileTransferSpeed, FormatLabel, Percentage, \
    ProgressBar, ReverseBar, RotatingMarker, \
    SimpleProgress, Timer, UnknownLength

ftp = ftplib.FTP("Your IP address")
ftp.login("Username", "password")
files = []

try:
    ftp.cwd("/feed_1")
    files = ftp.nlst()
    for fname in files:
        res = re.findall("2018-07-25", fname)
        if res:
            print 'Opening local file ' + ntpath.basename(fname)
            file = open(ntpath.basename(fname), 'wb')
            print 'Getting ' + ntpath.basename(fname)

            try:
                 widgets = ['Downloading: ', Percentage(), ' ',
                    Bar(marker='#',left='[',right=']'),
                    ' ', ETA(), ' ', FileTransferSpeed()]

                 pbar = ProgressBar(widgets=widgets, maxval=500)
                 pbar.start()
                 ftp.retrbinary('RETR ' + ntpath.basename(fname), file.write)

            except:
                pass

            print 'Closing file ' + ntpath.basename(fname)
            file.close() 
            print (fname)
            time.sleep(0.2)
            pbar.update()
            pbar.finish() 

        if not res:
            continue

except ftplib.error_perm , resp:
    if str(resp) == "550 No files found":
        print "No files in this directory"
        pass
    else:
        raise

请帮助了解这里到底出了什么问题。谢谢:)

Please help in understanding what's actually wrong here. Thanks :)

推荐答案

您永远不会更新 ProgressBar 。您需要做的是:

You never update the ProgressBar. What you need to do is to:


  • 实现要传递给 FTP.retrbinary 作为回调,而不是 file.write 。该函数应该执行 file.write 并更新进度条。

  • Implement a function (or a class method) that you will pass to FTP.retrbinary as callback instead of file.write. The function should do file.write and also update the progress bar.

您还需要知道 ProgressBar maxval 参数的文件/传输的大小。为此,您可以使用 FTP.size

You also need to know size of the file/transfer for maxval argument of ProgressBar. For that you can use FTP.size.

一个简单的实现方式是:

A trivial implementation is like:

local_path = "archive.zip"
remote_path = "/remote/path/archive.zip"

file = open(local_path, 'wb')

size = ftp.size(remote_path)

pbar = ProgressBar(widgets=widgets, maxval=size)
pbar.start()

def file_write(data):
   file.write(data) 
   global pbar
   pbar += len(data)

ftp.retrbinary("RETR " + remote_path, file_write)

现在您想要的进度条:

Downloading:  72% [###############################            ] ETA:   0:00:00 242.1 MiB/s






其他注意事项:OP代码使用 progressbar2

PyQt实现:从另一个运行FTP下载的线程更新PyQt进度

这篇关于在Python中显示FTP下载进度(ProgressBar)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆