注:文章原文为Dr. Charles Severance 的 《Python for Informatics》。文中代码用3.4版改写,并在本机测试通过。

12.8 用urllib读取二进制文件

  有时你想获取一个非文本文件,或者说二进制文件,比如图像或视频。这些文件中的数据不用打印出来,但是你可以轻松地用urllib从网络获取一份拷贝到你的硬盘。

  打开网络地址,读取并下载整个文档的内容至一个字符串变量(img),然后把文档内容写到本地文件的方式如下:

import urllib.request

img = urllib.request.urlopen('http://www.py4inf.com/cover.jpg').read()
fhand = open('cover.jpg', 'wb')
fhand.write(img)
fhand.close()

   这个程序立即通过网络读取所有数据,并把它们存储在你的计算机内存中的变量img中,然后打开cover.jpg文件,并把数据写到你的硬盘中。当这个文件的大小小于你的计算机内存时,它将正常工作。

  然而,如果这是一个很大的音、视频文件,这个程序可能崩溃,或者因为你的内存被耗尽而运行极慢。(注:一运行上面的程序,译者的计算机内存就耗尽了)。为了避免耗尽内存,我们用块或者缓存区来获取数据,然后在读下个块之前先把前一个块写入硬盘。在这种方式下,程序读取任何大小的文件都不会耗尽你的内存。修改后的代码如下:

import urllib.request
img = urllib.request.urlopen('http://www.py4inf.com/cover.jpg')
fhand = open('cover.jpg', 'wb')
size = 0
while True:
info = img.read(100000)
if len(info) < 1 :
break
size = size + len(info)
fhand.write(info)
print(size,'characters copied.')
fhand.close()

  在这个程序中,我们每次只读取100,000个字符,然后把这些字符写入到cover.jpg文件中,接着再读取100,000字符字符。运行这个程序,其输出如下:

70057 characters copied.

  如果你拥有的是Unix或者Macintosh计算机,你可以用系统内置的命令获取文件,具体操作如下:

curl -O http://www.py4inf.com/cover.jpg

  这个curl命令是“copy URL”的缩写,上面两个例子实现了curl类似的功能,这两个例子在www.py4inf.com/code目录下取巧命名为curl1.py和curl2.py。那里还有一个curl3.py的程序,让你写的程序中实际使用中更加有效。以下是3.4版本的curl3.py代码。

import os
import urllib.request print ('Please enter a URL like http://www.py4inf.com/cover.jpg')
urlstr = input().strip()
img = urllib.request.urlopen(urlstr) # Get the last "word"
words = urlstr.split('/')
fname = words[-1] # Don't overwrite the file
if os.path.exists(fname) :
if input('Replace '+fname+' (Y/n)?') != 'Y' :
print ('Data not copied')
exit()
print ('Replacing',fname) fhand = open(fname, 'wb')
size = 0
while True:
info = img.read(100000)
if len(info) < 1 : break
size = size + len(info)
fhand.write(info) print (size,'characters copied to',fname)
fhand.close()

Python for Infomatics 第12章 网络编程五(译)的更多相关文章

  1. Python for Infomatics 第12章 网络编程一(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 本书中的许多例子关注的是读取文件 ...

  2. Python for Infomatics 第12章 网络编程六(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...

  3. Python for Infomatics 第12章 网络编程四(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulS ...

  4. Python for Infomatics 第12章 网络编程三(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 ...

  5. Python for Infomatics 第12章 网络编程二(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.3 用HTTP协议获取一张 ...

  6. python之路(12)网络编程

    前言 基于网络通信(AF_INET)的socket(套接字)实现了TCP/UDP协议 目录 基于TCP协议的socket 基于UDP协议的socket TCP协议下粘包现象及处理 使用socketse ...

  7. CSAPP:第十一章 网络编程

    CSAPP:第十一章 网络编程 11.1 客户端服务器模型11.2 全球IP因特网11.3 套接字接口 11.1 客户端服务器模型   每个网络应用都是基于客户端-服务器模型.采用这个模型,一个应用是 ...

  8. Python学习day34-面向对象和网络编程总结

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. 《深入浅出Node.js》第7章 网络编程

    @by Ruth92(转载请注明出处) 第7章 网络编程 Node 只需要几行代码即可构建服务器,无需额外的容器. Node 提供了以下4个模块(适用于服务器端和客户端): net -> TCP ...

随机推荐

  1. Java与MySQL的连接

    下载数据库驱动文件,解压并保存至任意位置 下载地址 新建Java项目,并将驱动文件添加到项目中 项目名右键-->构建路径-->配置构建路径-->添加外部Jar 在项目中新建类,编写代 ...

  2. VC调试闪退解决办法

    在VC2010调试或执行EXE文件时,程序运行结束后自动退出了,想看到打印 可以采用几种方法: 1.按ctrl+F5只执行不调试 2.在cmd中手动调用 而不是直接点 3.加入getchar  #in ...

  3. CentOS6.3 编译安装LAMP(4):编译安装 PHP5.3.27

    所需源码包: /usr/local/src/PHP-5.3.27/libmcrypt-2.5.8.tar.gz /usr/local/src/PHP-5.3.27/mhash-0.9.9.9.tar. ...

  4. redis使用简介

    1.redis 支持"生产者与消费者模式"."订阅模式" 2.实时数据, 用数据类型.时间戳.数据内容,以二进制形式存取 3.查询时间.查询间隔时间.查询更新时 ...

  5. thinkphp自动验证---$_validate

    thinkphp中的自动验证 array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间]) 1.验证字段 需要验证的表单字段名称,这个字段不一定是数据库字段,也可以是表单的一些辅助字段 ...

  6. iOS开发——高级篇——iPad开发、iPad开发中的modal

    一.iPad简介 1.什么是iPad一款苹果公司于2010年发布的平板电脑定位介于苹果的智能手机iPhone和笔记本电脑产品之间跟iPhone一样,搭载的是iOS操作系统 2.iPhone和iPadi ...

  7. PHPStorm XDebug的安装

    环境: 我的系统: 4.4.0-43-generic #63-Ubuntu SMP Wed Oct 12 13:48:03 UTC 2016 x86_64 x86_64 x86_64 GNU/Linu ...

  8. Memcache 内存分配策略和性能(使用)状态检查

    前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅.本文不涉及安装.操作. ...

  9. gcc 使用

    参数 -E                只进行预处理-S                预处理和编译,生成汇编文件-c                预处理,编译和汇编,生成目标文件-g       ...

  10. 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。

    重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...