如何理解这一段Python代码?

with closing(requests.get(file_src,headers=headers,stream=True)) as response:
    with open(filename, 'wb') as fd:
        for chunk in response.iter_content(128):
            fd.write(chunk)

个人只是理解为:

一种良好的文件管理,接收和自动关闭流,但是还是不理解代码的意思,希望大佬给个通俗易懂的解释~谢谢
阅读 3.4k
3 个回答

你要理解上下文管理的原理是什么。

一个对象有 __enter____exit__ 方法,使用 with 时,它将先调用对象的 __enter__ 方法,在退出时再调用 __exit__ 方法。具体的清理代码就在这两个魔术函数中。

有一些类型已经写好了上下文管理器,就可以直接用 with ,比如 file object,
但有一些类型不清楚该使用哪种方式关闭资源,所以设计一个 closing 函数来手动关闭。
当你退出 with 的时候,会运行该对象的 close 方法

from contextlib import contextmanager

@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()

刚刚在手册上找到了,https://docs.python.org/3/lib...

给你个具体的例子吧:以字节流方式下载大文件.py

图片有5m大,双击 以字节流方式下载大文件.py即可看到运行效果。不要在ide里运行。

python3

##以字节流方式下载大文件.py
import requests as req
from contextlib import closing

chunk_size = 4096 # 数据块 尺寸
size=0 # 已经下载的字节数
imgsrc="http://www.onegreen.net/maps/Upload_maps/201412/2014120107143496.jpg"
filename='中国地图卫星地图超大(1.4亿像素).jpg'

with closing(req.get(imgsrc, stream=True))as rsp,\
     open(filename,'bw') as img :
    print('总长度:',rsp.headers['content-length']) # 文件总尺寸
    for data in rsp.iter_content(chunk_size=chunk_size):
        size += img.write(data)
        print('\r已下载: %s'% size, end='') # 已经保存的字节数
        
input('\nok')

@youyiqin
这是标准库里的正常写法,没事看看帮助文档啊~~

图片描述

应该是不理解with...as...语法吧,不知道try...except...finally...你熟悉不?

下面的代码:

with open(filename, 'wb') as fd:
    fd.write(chunk)

等同于:

try:
    fd = open(filename, 'wb')
    fd.write(chunk)
except:
    pass
finally:
    fd.close()

简而言之,with...as...的作用就是当文件或者类似文件对象(要有open方法,鸭子类型)被打开(open)后,即使发生错误抛出异常,文件或类似文件对象都能够正确的被关闭。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题