Show FTP download progress in Python (ProgressBar)(在 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
作为callback
而不是file.write
.该函数应该执行file.write
并更新进度条.
Implement a function (or a class method) that you will pass to
FTP.retrbinary
ascallback
instead offile.write
. The function should dofile.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)
现在你得到了你想要的进度条:
And now you get the progress bar you want:
Downloading: 72% [############################## ] ETA: 0:00:00 242.1 MiB/s
其他人注意:OP 代码使用 progressbar2
库.
PyQt 实现:从另一个运行 FTP 下载的线程更新 PyQt 进度.
这篇关于在 Python 中显示 FTP 下载进度(ProgressBar)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 Python 中显示 FTP 下载进度(ProgressBar)


基础教程推荐
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01