2016-02-29 66 views
2

我有一個控制檯腳本,它使用ftplib作爲後端從FTP服務器獲取大量文件。我想用tqdm給用戶一些反饋,只要他們有一個「詳細」的開關。這必須是可選的,因爲一些用戶可能會使用該腳本而無需訪問ttyPython的ftplib與tdqm

ftplibretrbinary方法需要回調,所以應該可以在那裏掛接tqdm。不過,我不知道這個回調會是什麼樣子。

回答

2

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) 

當心:此代碼是未經測試,可能必須進行調整。

2

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標誌和字節縮放