最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python編寫一個(gè)優(yōu)美的下載器

 更新時(shí)間:2018年04月15日 14:09:58   作者:ccpw_cn  
這篇文章主要教大家如何使用Python編寫一個(gè)優(yōu)美的下載器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Python編寫下載器的具體代碼,供大家參考,具體內(nèi)容如下

#!/bin/python3 
# author: lidawei 
# create: 2016-07-11 
# version: 1.0 
# 功能說明: 
#  從指定的URL將文件取回本地 
##################################################### 
 
import http.client 
import os 
import threading 
import time 
import logging 
import unittest 
from queue import Queue 
from urllib.parse import urlparse 
 
logging.basicConfig(level = logging.DEBUG, 
     format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', 
     datefmt = '%a, %d %b %Y %H:%M:%S', 
     filename = 'Downloader_%s.log' % (time.strftime('%Y-%m-%d')), 
     filemode = 'a') 
 
class Downloader(object): 
 '''''文件下載器''' 
 url = '' 
 filename = '' 
 
 def __init__(self, full_url_str, filename): 
  '''''初始化''' 
  self.url = urlparse(full_url_str) 
  self.filename = filename 
 
 def download(self): 
  '''''執(zhí)行下載,返回True或False''' 
  if self.url == '' or self.url == None or self.filename == '' or self.filename == None: 
   logging.error('Invalid parameter for Downloader') 
   return False 
 
  successed = False 
  conn = None 
  if self.url.scheme == 'https': 
   conn = http.client.HTTPSConnection(self.url.netloc) 
  else: 
   conn = http.client.HTTPConnection(self.url.netloc) 
  conn.request('GET', self.url.path) 
  response = conn.getresponse() 
  if response.status == 200: 
   total_size = response.getheader('Content-Length') 
   total_size = (int)(total_size) 
   if total_size > 0: 
    finished_size = 0 
    file = open(self.filename, 'wb') 
    if file: 
     progress = Progress() 
     progress.start() 
     while not response.closed: 
      buffers = response.read(1024) 
      file.write(buffers) 
 
      finished_size += len(buffers) 
      progress.update(finished_size, total_size) 
      if finished_size >= total_size: 
       break 
     # ... end while statment 
     file.close() 
     progress.stop() 
     progress.join() 
    else: 
     logging.error('Create local file %s failed' % (self.filename)) 
    # ... end if statment 
   else: 
    logging.error('Request file %s size failed' % (self.filename)) 
   # ... end if statment 
  else: 
   logging.error('HTTP/HTTPS request failed, status code:%d' % (response.status)) 
  # ... end if statment 
  conn.close() 
 
  return successed 
 # ... end download() method 
# ... end Downloader class 
 
class DataWriter(threading.Thread): 
 filename = '' 
 data_dict = {'offset' : 0, 'buffers_byte' : b''} 
 queue = Queue(128) 
 __stop = False 
 
 def __init__(self, filename): 
  self.filename = filename 
  threading.Thread.__init__(self) 
 
 #Override 
 def run(self): 
  while not self.__stop: 
   self.queue.get(True, 1) 
 
 def put_data(data_dict): 
  '''''將data_dict的數(shù)據(jù)放入隊(duì)列,data_dict是一個(gè)字典,有兩個(gè)元素:offset是偏移量,buffers_byte是二進(jìn)制字節(jié)串''' 
  self.queue.put(data_dict) 
 
 def stop(self): 
  self.__stop = True 
 
class Progress(threading.Thread): 
 interval = 1 
 total_size = 0 
 finished_size = 0 
 old_size = 0 
 __stop = False 
 
 def __init__(self, interval = 0.5): 
  self.interval = interval 
  threading.Thread.__init__(self) 
 
 #Override 
 def run(self): 
  # logging.info('  Total  Finished  Percent  Speed') 
  print('  Total  Finished  Percent  Speed') 
  while not self.__stop: 
   time.sleep(self.interval) 
   if self.total_size > 0: 
    percent = self.finished_size / self.total_size * 100 
    speed = (self.finished_size - self.old_size) / self.interval 
    msg = '%12d %12d %10.2f%% %12d' % (self.total_size, self.finished_size, percent, speed) 
    # logging.info(msg) 
    print(msg) 
 
    self.old_size = self.finished_size 
   else: 
    logging.error('Total size is zero') 
  # ... end while statment 
 # ... end run() method 
 
 def stop(self): 
  self.__stop = True 
 
 def update(self, finished_size, total_size): 
  self.finished_size = finished_size 
  self.total_size = total_size 
 
class TestDownloaderFunctions(unittest.TestCase): 
 
 def setUp(self): 
  print('setUp') 
 
 def test_download(self): 
  url = 'http://dldir1.qq.com/qqfile/qq/QQ8.4/18376/QQ8.4.exe' 
  filename = 'QQ8.4.exe' 
  dl = Downloader(url, filename) 
  dl.download() 
 
 def tearDown(self): 
  print('tearDown') 
 
if __name__ == '__main__': 
 unittest.main() 

這是測試結(jié)果:

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python Pillow Image.save 保存為jpg圖片壓縮問題

    Python Pillow Image.save 保存為jpg圖片壓縮問題

    Pillow 庫支持多種圖片格式,Pillow 能夠很輕松地實(shí)現(xiàn)圖片格式之間的轉(zhuǎn)換。本文就來詳細(xì)的介紹一下Image.save的具體使用,感興趣的可以了解一下
    2021-11-11
  • 使用Python實(shí)現(xiàn)從零開始打造一個(gè)三維繪圖系統(tǒng)

    使用Python實(shí)現(xiàn)從零開始打造一個(gè)三維繪圖系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)一個(gè)繪圖系統(tǒng),通過指定x,y,z的表達(dá)式,以實(shí)現(xiàn)三維繪圖的目的,感興趣的可以了解下
    2024-02-02
  • python?Sweetviz探索性數(shù)據(jù)可視化分析庫使用特征詳解

    python?Sweetviz探索性數(shù)據(jù)可視化分析庫使用特征詳解

    這篇文章主要為大家介紹了python?Sweetviz探索性數(shù)據(jù)可視化分析庫特征使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 基于python的前后端分離的模擬實(shí)現(xiàn)

    基于python的前后端分離的模擬實(shí)現(xiàn)

    前后端分離核心是UI界面展示層(View)和數(shù)據(jù)處理層(Model)通過控制層(Controller)進(jìn)行解耦合,在MVC設(shè)計(jì)模式中,前端主要負(fù)責(zé)數(shù)據(jù)展示和用戶交互(View),后端處理業(yè)務(wù)邏輯和數(shù)據(jù)存儲(chǔ)(Model),通過API接口進(jìn)行通信,提高了開發(fā)效率,便于前后端分工合作,有利于代碼的維護(hù)和迭代
    2024-10-10
  • 詳解Python 定時(shí)框架 Apscheduler原理及安裝過程

    詳解Python 定時(shí)框架 Apscheduler原理及安裝過程

    Apscheduler是一個(gè)非常強(qiáng)大且易用的類庫,可以方便我們快速的搭建一些強(qiáng)大的定時(shí)任務(wù)或者定時(shí)監(jiān)控類的調(diào)度系統(tǒng),這篇文章主要介紹了Python 定時(shí)框架 Apscheduler ,需要的朋友可以參考下
    2019-06-06
  • python將YUV420P文件轉(zhuǎn)PNG圖片格式的兩種方法

    python將YUV420P文件轉(zhuǎn)PNG圖片格式的兩種方法

    這篇文章主要介紹了python將YUV420P文件轉(zhuǎn)PNG圖片格式的兩種方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python爬蟲防封ip的一些技巧

    Python爬蟲防封ip的一些技巧

    這篇文章主要介紹了Python爬蟲防封ip的一些技巧,對(duì)平時(shí)學(xué)習(xí)爬蟲有所幫助,感興趣的朋友可以了解下
    2020-08-08
  • 關(guān)于Python正則表達(dá)式模塊之re模塊

    關(guān)于Python正則表達(dá)式模塊之re模塊

    這篇文章主要介紹了關(guān)于Python正則表達(dá)式模塊之re模塊,?re模塊是Python中的重要組成部分,這里涉及到字符串的匹配,轉(zhuǎn)換,自定義格式化等,需要的朋友可以參考下
    2023-04-04
  • pandas 使用merge實(shí)現(xiàn)百倍加速的操作

    pandas 使用merge實(shí)現(xiàn)百倍加速的操作

    這篇文章主要介紹了pandas 使用merge實(shí)現(xiàn)百倍加速的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python opencv 畫外接矩形框的完整代碼

    python opencv 畫外接矩形框的完整代碼

    這篇文章主要介紹了python-opencv-畫外接矩形框的實(shí)例代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

克什克腾旗| 孝义市| 根河市| 香河县| 湖北省| 龙门县| 南康市| 安泽县| 福清市| 哈巴河县| 通道| 马龙县| 聂拉木县| 商南县| 平凉市| 峨眉山市| 江山市| 若羌县| 宜丰县| 尖扎县| 栾川县| 古交市| 孝昌县| 微博| 宜良县| 云浮市| 博乐市| 余干县| 砚山县| 马鞍山市| 建水县| 志丹县| 霍山县| 佛山市| 兴文县| 吉隆县| 离岛区| 无极县| 东丰县| 左云县| 积石山|