当前位置: 首页 > 面试题库 >

Python GC也会关闭文件吗?

吴浩博
2023-03-14
问题内容

考虑下面的Python(2.x)代码:

for line in open('foo').readlines():
    print line.rstrip()

我假设由于打开的文件仍然未被引用,因此必须自动关闭它。我已经阅读了有关Python中的垃圾收集器的信息,该垃圾收集器可释放未使用对象分配的内存。GC是否也足以处理文件?


问题答案:

取自文档(python 3.6):

如果未使用with关键字,则应调用f.close()关闭文件并立即释放文件使用的所有系统资源。如果您未明确关闭文件,
Python的垃圾回收器最终将破坏该对象并为您关闭打开的文件
,但该文件可能会保持打开状态一段时间。另一个风险是,不同的Python实现将在不同的时间进行清理。

因此,是的,文件将自动关闭,但是为了控制该过程,您应该自己关闭或使用以下with语句:

with open('foo') as foo_file
    for line in foo_file.readlines():
        print line.rstrip()

foo_file``with区块结束后将被固定

在python 2.7
docs中,措辞不同:

处理完文件后,调用f.close()将其关闭并释放打开文件占用的所有系统资源。调用f.close()之后,尝试使用文件对象将自动失败。

因此,我假设您不应该依赖垃圾收集器自动为您关闭文件,而只需手动/使用 with



 类似资料:
  • 考虑下面这段Python(2.x)代码: 我假设,由于打开的文件仍然未被引用,因此必须自动关闭。我读过Python中的垃圾收集器,它释放由未使用的对象分配的内存。GC是否也足够处理这些文件?

  • 的JavaDoc没有说明关闭底层: https://docs.oracle.com/javase/8/docs/api/java/io/inputstreamreader.html#close-- 从类复制的描述:Reader 关闭流并释放与之关联的任何系统资源。一旦流关闭,进一步的read()、ready()、mark()、reset()或skip()调用将引发IOException。关闭以前关

  • JavaDoc for没有提到关闭底层的: https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html#close-- 从课堂上复制的描述:Reader 关闭流并释放与之关联的所有系统资源。流关闭后,进一步的read()、ready()、mark()、reset()或skip()调用将抛出IOException。

  • 在写nodejs文件的时候发现,明明是js文件却有类型提示,甚至按住Ctrl点击也会跳转到对应的 .d.ts 声明文件,这是为什么呢? 项目目录 package.json 现象

  • defer 关键字(参看 6.4)对于在函数结束时关闭打开的文件非常有用,例如下面的代码片段: func data(name string) string { f, _ := os.OpenFile(name, os.O_RDONLY, 0) defer f.Close() // idiomatic Go code! contents, _ := ioutil.ReadAl

  • 我正在用JPA和Hibernate做一些简单的测试,当我不希望的时候,我碰巧关闭了EntityManager。 这是我的测试主: DB助手: 实体和对应的DAO: 在商店里,当开始交易时,我得到以下信息: 未执行关机方法。为什么实体管理器关闭? 为了完整起见,以下是persistence.xml: