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.
Here's my code:
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 :)
You never update the ProgressBar. What you need to do is to:
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.
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
Note for others: The OP code uses progressbar2 library.
PyQt implementation: Update PyQt progress from another thread running FTP download.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With