逐行文件处理,for-loop vs with

Lev*_*von 14 python file-io for-loop with-statement

我试图理解这些与逐行处理打开文件的方式之间的权衡/差异

with open('data.txt') as inf:
    for line in inf:
       #etc
Run Code Online (Sandbox Code Playgroud)

VS

for line in open('data.txt'):
   # etc
Run Code Online (Sandbox Code Playgroud)

我理解使用with确保在退出"with-block"(套件?)(或者反对异常)时文件被关闭.with自从我在这里学到它以来,我一直在使用.

重新for-loop:来自各地的净等搜索,似乎无论是当文件被关闭for-loop退出取决于具体的实现?我找不到任何关于这个结构如何处理异常的信息.有人知道吗?

如果我对上述任何事情都有误,我会欣赏更正,否则是否有理由使用该for结构 with?(假设你有一个选择,即不受Python版本的限制)

Joh*_*ooy 29

这个问题

for line in open('data.txt'):
   # etc
Run Code Online (Sandbox Code Playgroud)

是不是你没有明确引用打开的文件,那你怎么关闭呢?懒惰的方式是等待垃圾收集器清理它,但这可能意味着资源没有及时释放.

所以你可以说

inf = open('data.txt')
for line in inf:
   # etc
inf.close()
Run Code Online (Sandbox Code Playgroud)

现在如果你在for循环中有异常会发生什么?该文件不会显式关闭.

添加一个 try/finally

inf = open('data.txt')
try:
    for line in inf:
       # etc
finally:
    inf.close()
Run Code Online (Sandbox Code Playgroud)

这是很多代码来做一些非常简单的事情,因此添加with了Python 以使代码能够以更易读的方式编写.这让我们来到这里

with open('data.txt') as inf:
    for line in inf:
       #etc
Run Code Online (Sandbox Code Playgroud)

所以,这是打开文件的首选方式.如果您的Python对于with语句来说太旧了,那么您应该使用该try/finally版本的生产代码