for line in open(文件名)

36 投票
4 回答
68508 浏览
提问于 2025-04-15 14:36

我经常看到类似这样的Python代码:

for line in open(filename):
    do_something(line)

那这个代码里,文件名什么时候会被关闭呢?

这样写会不会更好呢:

with open(filename) as f:
    for line in f.readlines():
        do_something(line)

4 个回答

9

with 这个写法更好,因为它会在操作完成后自动关闭文件。你甚至不需要使用 readlines(),直接用 for line in file 就可以了。

我觉得第一个写法没有关闭文件。

11

别用 .readlines() 这个方法。对于大文件来说,它会占用很多内存,既多余又不太好。使用 'with' 语句块的方式总是能确保文件会被关闭。

with open(filename) as file_:
    for line in file_:
        do_something(line)

如果你用简单的 'for' 循环来处理文件,文件什么时候会被关闭就取决于你用的 Python 版本了。

41

filename会在它的作用域结束时关闭。通常来说,这个作用域就是方法的结束。

是的,使用with会更好。

一旦你有了一个文件对象,你就可以通过调用这个对象的方法来进行所有的文件输入输出操作。[...] 当你完成文件操作后,应该调用这个对象的close方法来关闭与文件的连接:

input.close()

在一些简单的脚本中,人们常常会省略这一步,因为Python会在垃圾回收时自动关闭文件对象(在主流的Python中,这意味着文件几乎会立即关闭,尽管其他一些重要的Python实现,比如Jython和IronPython,采用了更宽松的垃圾回收策略)。不过,尽早关闭文件是一个好的编程习惯,尤其是在较大的程序中,这样可以避免有太多不必要的打开文件存在。需要注意的是,try/finally特别适合确保文件在函数因为未捕获的异常而终止时也能被关闭。

Python Cookbook, 第59页。

撰写回答