zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    搜索文件/目录的shell脚本
    git的编译安装
    linux命令行直接执行MySQL/MariaDB语句查询
    MySQL重置root密码
    图解TCP/IP三次握手
    使用pull命令从Docker Hub仓库中下载镜像到本地
    BZOJ1051 [HAOI2006]受欢迎的牛(Tarjan缩点)
    BZOJ1026 [SCOI2009]windy数(数位DP)
    CERC2017 H Hidden Hierarchy(树+模拟)
    2018icpc徐州网络赛-H Ryuji doesn't want to study(线段树)
  • 原文地址:https://www.cnblogs.com/zhengsh/p/5436471.html
Copyright © 2011-2022 走看看