为什么用open()更好地在Python中打开文件? [英] Why is `with open()` better for opening files in Python?

查看:148
本文介绍了为什么用open()更好地在Python中打开文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通常当有人发布他们的代码时,人们会添加你应该使用打开('filename')作为f 语法。我同意,大多数老式的 f = open()语句没有随附的 .close(),而且我甚至回答了这个依赖隐式关闭的问题是他们编程问题的全部原因。然而,在某些情况下,将代码嵌套到块似乎在编写代码时会带来其他不便。例如,我有时候喜欢在开始时使用一个标志来表示 writefile = True 。这让我只打开和关闭文件,如果它将被使用,同时保持相同的处理线程。在代码的不同位置,我可以打印屏幕或写入文件。 (我意识到我会打开 stdout 或开头的文件,而不是使用该方法。)



我的问题是:除了不必显式地关闭文件之外,是否还有其他的理由使用语法来处理文件,尤其是输出文件? (更pythonic本身并不是一个理由)如果这是一个重复,我会很高兴有这个指出,但我找不到它。

不存在其他优势

无论如何,为了在发生异常时关闭文件,您需要一个有作用域的块:

  writefile = random.choice([True,False])
f = open(filename)if writefile else None
try:
#some code or other
finally:
如果写文件:
f.close()

确实是正确的代码的缺点(在需要清理的情况下),无论你如何编写它。


Frequently when someone posts their code, people will add as an aside that "you should use with open('filename') as f syntax now." I agree that most of the old-fashioned f = open() statements don't have an accompanying .close(), and I have even answered questions where this reliance on "implicit close" was the entire cause of their programming problem.

However, in some cases nesting your code inside the with block seems to create other inconveniences in writing the code. For example I sometimes like to use a flag at the beginning to say writefile = True. This lets me only open and close the file if it is going to be used, while keeping the same processing thread. At various places in the code I can either print to screen or write to a file. (I realize I would open stdout or the file at the beginning and use that approach instead.)

My question is: besides not having to explicitly close the file, are there other reasons to use the with syntax for handling files, especially output files? ("More pythonic" by itself is not a reason.) If this is a duplicate, I would be glad to have this pointed out, but I couldn't find it myself.

解决方案

There's no other advantage of with: ensuring cleanup is the only thing it's for.

You need a scoped block anyway in order to close the file in the event of an exception:

writefile = random.choice([True, False])
f = open(filename) if writefile else None
try:
    # some code or other
finally:
    if writefile:
        f.close()

So, the thing you describe as a disadvantage of with is really a disadvantage of correct code (in the case where cleanup is required), no matter how you write it.

这篇关于为什么用open()更好地在Python中打开文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆