python - 在python中打开和关闭文件

标签 python file with-statement contextmanager

我读过当使用以下格式打开文件时

with open(filename) as f:
       #My Code
f.close()

不需要明确关闭文件。有人可以解释为什么会这样吗?另外,如果有人明确关闭文件,是否会产生不良影响?

最佳答案

最重要的概述是这样的:当您离开嵌套 block 时,Python 会自动为您调用 f.close()

不管是直接从底部掉下去,还是调用break/continue/return跳出它,或引发异常;无论你如何离开那个街区。它总是知道您要离开,所以它总是关闭文件。*


向下一层,您可以将其视为映射到 try:/finally: 语句:

f = open(filename)
try:
    # My Code
finally:
    f.close()

再往下一层:它怎么知道调用 close 而不是调用其他东西?

嗯,事实并非如此。它实际上调用了特殊方法 __enter____exit__:

f = open()
f.__enter__()
try:
    # My Code
finally:
    f.__exit__()

open 返回的对象(Python 2 中的 file,Python 3 中 io 的包装器之一)有类似里面有这个:

def __exit__(self):
    self.close()

它实际上比上一个版本更复杂一些,这使得生成更好的错误消息变得更容易,并且让 Python 避免“进入”一个它不知道如何“退出”的 block 。

要了解所有详细信息,请阅读 PEP 343 .


Also if someone does explicitly close the file, will it have any undesirable effect ?

一般来说,这是一件坏事。

但是,文件对象竭尽全力确保其安全。对已关闭的文件执行任何操作都是错误的——除非再次关闭它。


* 除非你离开,比如说,在服务器执行脚本的过程中拔下服务器的电源线。在那种情况下,显然,它永远不会运行任何 代码,更不用说关闭 了。但是显式的 close 几乎帮不了你。

关于python - 在python中打开和关闭文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459867/

相关文章:

python - 在 Python 抓取脚本中请求多个 url

python - 通过匹配字典的值,在列表中查找字典的索引

file - Flutter 使用 http 包监控文件上传进度

python的 `with`语句目标竟然是None

python - 如何使用 "with"调用 tempfile.mkstemp() ? - 或者为什么它不返回带有 __exit__() 的 fd?

python - scrapy中如何提取准确的标签

Python OCR 与 Pytesseract 的问题

perl - 如何在不使用 :content_file option? 的情况下将响应作为文件处理

django - 当我从数据库/模型中删除对象时,如何让 Django Admin 删除文件?

javascript - 为什么浏览器会两次获取 Symbol.unscopables?