我有一個控制檯腳本,它使用ftplib作爲後端從FTP服務器獲取大量文件。我想用tqdm給用戶一些反饋,只要他們有一個「詳細」的開關。這必須是可選的,因爲一些用戶可能會使用該腳本而無需訪問tty
。Python的ftplib與tdqm
ftplib的retrbinary
方法需要回調,所以應該可以在那裏掛接tqdm。不過,我不知道這個回調會是什麼樣子。
我有一個控制檯腳本,它使用ftplib作爲後端從FTP服務器獲取大量文件。我想用tqdm給用戶一些反饋,只要他們有一個「詳細」的開關。這必須是可選的,因爲一些用戶可能會使用該腳本而無需訪問tty
。Python的ftplib與tdqm
ftplib的retrbinary
方法需要回調,所以應該可以在那裏掛接tqdm。不過,我不知道這個回調會是什麼樣子。
從FTP.retrbinary
:
回調函數被調用用於接收,具有一個字符串參數給出數據塊的每個數據塊。
因此回調可能是這樣的:
with open(filename, 'wb') as fd:
total = ftpclient.size(filename)
with tqdm(total=total) as pbar:
def cb(data):
l = len(data)
pbar.update(l)
fd.write(data)
ftpclient.retrbinary('RETR {}'.format(filename), cb)
當心:此代碼是未經測試,可能必須進行調整。
當with
塊終止時,該代碼不應起作用,因爲pbar
將會「關閉」,with
塊將在ftpclient.retrbinary(...)
之前發生。你需要一個非常小的壓痕模:
with open(filename, 'wb') as fd:
total = ftpclient.size(filename)
with tqdm(total=total,
unit='B', unit_scale=True, unit_divisor=1024,
disable=not verbose) as pbar:
def cb(data):
pbar.update(len(data))
fd.write(data)
ftpclient.retrbinary('RETR {}'.format(filename), cb)
編輯添加disable
標誌和字節縮放