我知道如果在Python中不再使用它,使用close关闭文件是一个好习惯.我试图打开大量打开的文件,而不是关闭它们(在相同的Python进程中),但没有看到任何异常或错误.我试过Mac和Linux.所以,只是想知道Python是否足够智能来管理文件句柄以自动关闭/重用它们,这样我们就不需要关心文件关闭了?
林先生,提前谢谢
Jam*_*lls 19
通常,Python 将不再使用垃圾收集对象,不再被引用.这意味着与垃圾收集器的过滤器匹配的打开文件对象完全可能会被清理并可能关闭.然而 ; 你不应该依赖于此,而是使用:
with open(..):
Run Code Online (Sandbox Code Playgroud)
示例(也是最佳实践):
with open("file.txt", "r") as f:
# do something with f
Run Code Online (Sandbox Code Playgroud)
注意:如果您没有关闭文件并在系统上留下"打开文件描述符",您最终将开始在系统上达到资源限制; 特别是"ulimit".您最终将开始看到与"太多打开的文件"相关的操作系统错误.(假设Linux在这里,但其他操作系统会有类似的行为).
重要提示:关闭您编写的任何打开文件也是一种很好的做法,这样您编写的数据就会被正确刷新.这有助于确保数据完整性,并且由于应用程序崩溃,文件不会意外地包含损坏的数据.
值得注意的是,上述重要说明是您写入文件的许多问题的原因; 读回来; 发现它是空的; 但然后关闭你的python程序; 在文本编辑器中阅读它并意识到它不是空的.
演示:如果您不确保关闭打开的文件,可能会遇到资源限制和错误的一个很好的示例:
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> xs = [open("/dev/null", "r") for _ in xrange(100000)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 24] Too many open files: '/dev/null'
Run Code Online (Sandbox Code Playgroud)
要添加到James Mills的答案中,如果您需要了解具体原因,则不会发现任何错误:
Python定义了当文件被垃圾收集时,它将自动关闭.但是Python将它留给实现它想要处理垃圾收集的方式.CPython,您可能正在使用的实现,通过引用计数来实现:只要对象的最后一次引用消失,就会立即收集它.所以,所有这些似乎都适用于CPython:
def spam():
for i in range(100000):
open('spam.txt') # collected at end of statement
def eggs():
for i in range(100000):
f = open('eggs.txt') # collected next loop, when f is reassigned
def beans():
def toast():
f = open('toast.txt') # collected when toast exits
for i in range(100000):
toast()
Run Code Online (Sandbox Code Playgroud)
但是许多其他实现(包括其他三大实现,PyPy,Jython和IronPython)使用更智能的垃圾收集器来动态检测垃圾,而无需跟踪所有引用.这使得它们更有效,更好地处理线程等,但这意味着当收集对象时它不是确定性的.所以相同的代码将无法正常工作.或者更糟糕的是,它会在你的60个测试中起作用,然后在你为你的投资者做一个演示时就会失败.
如果您需要PyPy的速度或IronPython的.NET集成,那将是一种耻辱,但如果不重写所有代码就无法拥有它.或者,如果其他人想要使用您的代码,但需要它在Jython中工作,并且必须查看其他地方.
同时,即使在CPython中,解释器也不会在关机时收集所有垃圾.(它变得越来越好,但即使在3.4中也不是很完美.)所以在某些情况下,你依靠操作系统为你关闭文件.操作系统通常会在它执行时刷新它们,但如果您(例如,在守护程序线程中打开它们,或者您退出os._exit
,或者已经离开),则可能不会.(当然,如果你有人绊倒电源线,那肯定不行.)
最后,即使CPython(我认为从3.3开始)也有专门用于生成警告的代码,如果你让你的文件被垃圾收集而不是关闭它们.这些警告默认是关闭的,但人们经常建议打开它们,有一天它可能会发生.
归档时间: |
|
查看次数: |
1603 次 |
最近记录: |