有很多時候需要從服務端下載文件,比如更新客戶端的版本, 從服務端下載文件進行解析等很多的時候選下載文件操作,今天記錄一下python 從服務端下載文件的操作,
代碼如下:
#!/usr/bin/env python2 # -*- coding: utf-8 -*- from urllib import urlretrieve class software(object): def __init__(self): super(software, self).__init__() def start(self): url = 'http://192.168.3.124:8074/ComputerSecConsole/upload/update/2.2/update.tar' local = './update.tar' try: urlretrieve(url, local, self.callbackfunc) # except Exception as e: print "Exception" def callbackfunc(self,blocknum, blocksize, totalsize): '''回調函數 @blocknum: 已經下載的數據塊 @blocksize: 數據塊的大小 @totalsize: 遠程文件的大小 ''' print "blocknum ",blocknum,"blocksize ",blocksize,"totalsize ",totalsize percent = 100.0 * blocknum * blocksize / totalsize if percent > 100: percent = 100 print "%.2f%%" % percent," ",blocknum *blocksize," ",totalsize if __name__ == '__main__': print("main") s = software() s.start()
運行結果:
[root@localhost text]# python text.py main blocknum 0 blocksize 8192 totalsize 788170240 0.00% 0 788170240 blocknum 1 blocksize 8192 totalsize 788170240 ................. 100.00% 788168704 788170240 blocknum 96213 blocksize 8192 totalsize 788170240 100.00% 788176896 788170240
主要函數 : urlretrieve
參數說明:
url:外部或者本地url
filename:指定了保存到本地的路徑(如果未指定該參數,urllib會生成一個臨時文件來保存數據);
reporthook:是一個回調函數,當連接上服務器、以及相應的數據塊傳輸完畢的時候會觸發該回調。我們可以利用這個回調函數來顯示當前的下載進度。
data:指post到服務器的數據。該方法返回一個包含兩個元素的元組(filename, headers),filename表示保存到本地的路徑,header表示服務器的響應頭
但是此程序還不過完善,在下載大的文件中,突然斷網,會出現死循環,下一部解決這個問題, 加油!!