Python for Infomatics 第12章 网络编程五(译)
注:文章原文为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章 网络编程五(译)的更多相关文章
- Python for Infomatics 第12章 网络编程一(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 本书中的许多例子关注的是读取文件 ...
- Python for Infomatics 第12章 网络编程六(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...
- Python for Infomatics 第12章 网络编程四(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulS ...
- Python for Infomatics 第12章 网络编程三(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 ...
- Python for Infomatics 第12章 网络编程二(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.3 用HTTP协议获取一张 ...
- python之路(12)网络编程
前言 基于网络通信(AF_INET)的socket(套接字)实现了TCP/UDP协议 目录 基于TCP协议的socket 基于UDP协议的socket TCP协议下粘包现象及处理 使用socketse ...
- CSAPP:第十一章 网络编程
CSAPP:第十一章 网络编程 11.1 客户端服务器模型11.2 全球IP因特网11.3 套接字接口 11.1 客户端服务器模型 每个网络应用都是基于客户端-服务器模型.采用这个模型,一个应用是 ...
- Python学习day34-面向对象和网络编程总结
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- 《深入浅出Node.js》第7章 网络编程
@by Ruth92(转载请注明出处) 第7章 网络编程 Node 只需要几行代码即可构建服务器,无需额外的容器. Node 提供了以下4个模块(适用于服务器端和客户端): net -> TCP ...
随机推荐
- 工作中的一些JS--为网页动态添加元素,类似于邮箱添加联系人的功能
项目中要解决一个为下拉框动态添加选项的问题,之前从网上搜到结果,写个JS函数 //先新建元素,并添加属性 var option = document.createElement("optio ...
- entity
- Pjax调用
$.pjax({container:'#content_center',url:href,data:data}); $(document).on('pjax:send', function() {// ...
- MySQL数据库命名及设计规范
1.设计原则 1) 标准化和规范化 数据的标准化有助于消除数据库中的数据冗余.标准化有好几种形式,但 Third Normal Form(3NF)通常被认为在性能.扩展性和数据完整性方面达到了最好平衡 ...
- PHP如何获取Post请求中的Json字符串数据?
摘自:http://dianjingjiaoyu.blog.163.com/blog/static/18347920820114194642257/ 最近用到ext与PHP交互,ext把json数据p ...
- 搭建 Windows Server 2003 + IIS6.0 + FastCGI + PHP5.3.29 + MySQL5.5.38 + Memcached1.2.6
一.下载相关软件: 1.VC9运行库 即VISUAL C++ 2008 自PHP5.3.0开始,PHP提供VC2008编译版,需要安装VC++ 2008的运行库. [微软官方下载] http://ww ...
- Shell入门教程:Shell当中的特殊变量
Shell当中的特殊变量 一.保留变量 $IFS 这个变量中保存了用于分割输入参数的分割字符,默认识空格. $HOME 这个变量中存储了当前用户的根目录路径. $PATH 这个变量中存储了当前 She ...
- linux常用命令-权限管理命令
chmod [{ugoa}{+-=}{rwx}] [文件或目录] [mode=421] [文件或目录] -R 递归修改 例:chmod g+w,o-r 文件或目录 但是一般用数字配置权限,例:chm ...
- 使用Notepad++实现批量将ANSI转成为UTF-8编码
http://blog.sina.com.cn/s/blog_5f4150730101b3ok.html 使用Trados2011翻译英文html后,如果是单个文件,可在另存译文时选择Encoding ...
- MySQL备份之【mydumper 学习】
MySQL在备份方面包含了自身的mysqldump工具,但其只支持单线程工作,这就使得它无法迅速的备份数据.而mydumper作为一个实用工具,能够良好支持多线程工作,这使得它在处理速度方面十倍于传统 ...