日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python编写下载器可暂停_Python编写一个优美的下载器

發布時間:2025/3/15 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python编写下载器可暂停_Python编写一个优美的下载器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例為大家分享了python編寫下載器的具體代碼,供大家參考,具體內容如下 #!/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):

'''''執行下載,返回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的數據放入隊列,data_dict是一個字典,有兩個元素:offset是偏移量,buffers_byte是二進制字節串'''

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()

這是測試結果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持聚米學院。

總結

以上是生活随笔為你收集整理的python编写下载器可暂停_Python编写一个优美的下载器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。