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 ...
随机推荐
- [Web开发] 在HTML代码里面如何判断IE版本
在上一篇blog里面提到IE有不同的显示模式以及如何用Javascript 来动态判定. Web开发者可以根据不同显示模式导入不同的内容.这篇blog 主要讲如何让静态HTML代码根据不同IE版本显示 ...
- GIT本地配置和PUSH
因为GIT使用的是LINUX命令,所以可以参考LINUX的相关命令 一.在本地配置好GIT仓库: 1.首先进入当前工程的目录:cd [filepath] (记住这里的目录应该用/,因为LINUX是这样 ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- tyvj1106 登山
背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结…… 不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物.所以晴 ...
- jsp动作元素之forward指令
forward指令用于将页面响应转发到另外的页面.既可以转发到静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet. forward指令格式如下: <jsp:for ...
- UVA-11997 K Smallest Sums
UVA - 11997 K Smallest Sums Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- cf126b(kmp好题)
http://codeforces.com/contest/126/problem/B #include<bits/stdc++.h> using namespace std; const ...
- BZOJ 4725: [POI2017]Reprezentacje ró?nicowe
Description 一个数列. \(a_1=1,a_2=2\) 当 \(n>2\) 时 \[a_n = \{ \begin {matrix} 2a_{n-1},\text{n is an ...
- mysql开启远程连接
修改my.ini 去掉 bind-address 127.0.0.1 或添加 bind-address 0.0.0.0 mysql -u root -p 进入mysql,执行 '; 然后 flush ...
- spring jpa 实体互相引用返回restful数据循环引用报错的问题
spring jpa 实体互相引用返回restful数据循环引用报错的问题 Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里 Problem对象,引用了标签列表ProblemLa ...