专栏首页python前行者urllib.request.urlretrieve()函数

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表示服务器的响应头。
# encoding=utf-8
import os,sys,urllib.request,time


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()#刷新输出

local_filename, headers= urllib.request.urlretrieve(DATA_URL, filename, _progress)
print('\n')
print(local_filename, headers)
# html = open(local_filename)
# html.close()

输出

Downloading Python-2.7.5.tar.bz2 100.0%

Python-2.7.5.tar.bz2 Server: nginx
Content-Type: application/octet-stream
Last-Modified: Sun, 12 May 2013 03:46:19 GMT
ETag: "518f108b-b95bfe"
X-Clacks-Overhead: GNU Terry Pratchett
Via: 1.1 varnish
Content-Length: 12147710
Accept-Ranges: bytes
Date: Thu, 17 Jan 2019 02:35:27 GMT
Via: 1.1 varnish
Age: 10961451
Connection: close
X-Served-By: cache-iad2148-IAD, cache-tyo19922-TYO
X-Cache: HIT, HIT
X-Cache-Hits: 0, 4
X-Timer: S1547692527.414428,VS0,VE0
Strict-Transport-Security: max-age=63072000; includeSubDomains

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

for i in range(5):
    # print(i)
    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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [701]labelImg标注工具

    labelImg github:https://github.com/tzutalin/labelImg exe下载:https://tzutalin.git...

    周小董
  • 利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)

    WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素。若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了。

    周小董
  • Python numpy(flatten,flat,ravel,reshape,resize)数组重组

    请注意上述两者之间的区别,numpy.resize重组数据不够时,使用原数据依次填补;ndarray.resize重组数据不够时,使用原数据第一个元素填补。

    周小董
  • Python编程从入门到实践之使用列表|第3天

    要创建切片,可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样,Python 在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个...

    你好我是森林
  • Spark Storage ③ - Master 与 Slave 之间的消息传递与时机

    再次重申标题中的 Master 是指 Spark Storage 模块的 Master,是运行在 driver 上的 BlockManager 及其包含的 Bl...

    codingforfun
  • UOJ#179. 线性规划(线性规划)

    有 nn 个实数变量 x1,x2,…,xnx1,x2,…,xn 和 mm 条约束,其中第 ii 条约束形如 ∑nj=1aijxj≤bi∑j=1naijxj≤bi...

    attack
  • NAS 篇二:外网访问NAS上面的应用

    一开始跟客服说客服说办理专网才有公网IP,申请失败!(客服可能理解错了,要的不是固定的公网IP,有钱当然随意了)

    IT小马哥
  • 从零编程基础小白到专业数据分析师,你需要走多远

    美国企业与高等教育论坛(BHEF)与普华永道(PWC)近期发布重要报告,数据科学与数据分析的人才需求每年都在增长,而每年的高校毕业生数量远远无法满足行业需求。 ...

    数据猿
  • Python|如何构建自己的IP池

    在爬取网站的过程中,很多网站都有反爬机制,它可能会限制每个Ip的访问速度或访问次数。如果限制访问的速度,则可以通过time.sleep进行短暂休眠后再次爬取。但...

    算法与编程之美
  • Python 爬虫实践:《战狼2》豆瓣影评分析

    数据科学社区

扫码关注云+社区

领取腾讯云代金券