【问题标题】:Show FTP download progress in Python (ProgressBar)在 Python 中显示 FTP 下载进度(ProgressBar)
【发布时间】:2019-01-12 00:27:29
【问题描述】:

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

这是我的代码:

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

请帮助了解这里的实际问题。谢谢:)

【问题讨论】:

    标签: python download ftp progress-bar ftplib


    【解决方案1】:

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

    • 实现一个函数(或类方法),您将作为callback 而不是file.write 传递给FTP.retrbinary。该函数应该执行file.write 并更新进度条。

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

    一个简单的实现是这样的:

    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 library

    PyQt 实现:Update PyQt progress from another thread running FTP download

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多