urllib.request.urlretrieve()函数

参考python document

描述

  urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)

函数说明

  将URL表示的网络对象复制到本地文件。如果URL指向本地文件,则对象将不会被复制,除非提供文件名。返回一个元组()(filename,header),其中filename是可以找到对象的本地文件名,header是urlopen()返回的对象的info()方法(用于远程对象)。第二个参数(如果存在)指定要复制到的文件位置(如果没有,该位置将是一个生成名称的 tempfile)。第三个参数,如果存在,则是一个回调函数,它将在建立网络连接时调用一次,并且在此后每个块读取后调用一次。这个回调函数将传递三个参数;到目前为止传输的块计数,以字节为单位的块大小,以及文件的总大小。第四个参数可能是-1,在旧的FTP服务器上,它不返回文件大小以响应检索请求。

参数说明

  url:外部或者本地url

  filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);

  reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。

  data:指post到服务器的数据。

返回值

  该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。

  例子

import os
import urllib.request
import sys

DATA_URL = 'http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2'
filename = DATA_URL.split('/')[-1]

def _progress(block_num, block_size, total_size):
    '''回调函数
       @block_num: 已经下载的数据块
       @block_size: 数据块的大小
       @total_size: 远程文件的大小
    '''
    sys.stdout.write('\r>> Downloading %s %.1f%%' % (filename,
                     float(block_num * block_size) / float(total_size) * 100.0))
    sys.stdout.flush()

filepath, _ = urllib.request.urlretrieve(DATA_URL, filename, _progress)
print()

  输出:

  >> Downloading Python-2.7.5.tar.bz2 100.0%

  例子中的sys.stdout.write和print差不多是输出的意思,sys.stdout.flush()函数的作用是刷新输出

  可以参考博客:https://blog.csdn.net/wuguangbin1230/article/details/77680058

  python3下的代码如下:

import time  
import sys  
   
for i in range(5):  
    print(i,end='')  
    #sys.stdout.flush()  
    time.sleep(1) 

  这个程序本意是每隔一秒输出一个数字,但是如果把这句话sys.stdout.flush()注释的话,你就只能等到程序执行完毕,屏幕上会一次性输出0,1,2,3,4。

  如果你加上sys.stdout.flush(),刷新stdout,这样就能每隔一秒输出一个数字了。

  可以用在网络程序中多线程程序,多个线程后台运行,同时要能在屏幕上实时看到输出信息。

  转载地址:https://blog.csdn.net/pursuit_zhangyu/article/details/80556275

posted @ 2020-06-17 11:21  PRO_Z  阅读(1789)  评论(0编辑  收藏  举报