确保文件在Python中关闭

Con*_*nce 4 python file-io

我有可以将文件作为参数的类,例如:

ParserClass(file('/some/file', 'rb'))
Run Code Online (Sandbox Code Playgroud)

如果我正确理解Python,一旦对象被垃圾收集,该文件将自动关闭.我不明白的是当这种情况发生时.在像这样的功能:

def parse_stuff(filename):
    parser = ParserClasss(file(filename, 'rb'))

    return list(parser.info())
Run Code Online (Sandbox Code Playgroud)

parser在函数退出后,该对象不应该立即被GC'd,导致文件被关闭吗?然而,出于某种原因,Python似乎在函数退出后很长时间才打开文件.或者至少它看起来那样,因为Windows不会让我修改文件,声称Python打开它并迫使我关闭IDLE.

有没有办法确保文件被关闭,没有明确要求我创建的每个文件?我还想补充一点,这些类是外部的,我不想通过它们来深入了解它们与文件的对应关系.

Nat*_*usa 12

您可以使用该with语句打开该文件,这将确保文件已关闭.

with open('/some/file', 'rb') as f:
    parser = ParserClasss(f)
    return list(parser.info())
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见http://www.python.org/dev/peps/pep-0343/.

  • @Confluence不,你不能.Python(或任何其他GC语言)可以自动解决的唯一问题是当一个对象不再可能被使用时,即使这样,它也可能只会在它变得无法访问之后很久就会注意到.即使它*可以*总是立即检测到不可达性,但仍然没有(考虑`f = open(...); read_but_dont_close(f); do_a_lot_of_work()`).习惯了`with`.即使忽略了技术利益,它也会使使用期间变得明确,而明确则优于隐含. (2认同)

Sil*_*Ray 6

您可以with用来打开文件.使用with时,with退出块时将隐式关闭文件,并且它也将处理异常状态.

  • +1提及"with``也能很好地处理异常的事实 - 这是非常重要的一点. (2认同)