15

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

with open('data.txt') as inf:
    for line in inf:
       #etc

对比

for line in open('data.txt'):
   # etc

我了解 usingwith可确保在退出“with-block”(套件?)时关闭文件(或反击异常)。with所以自从我在这里了解到它以来,我一直在使用它。

重新for循环:通过搜索网络和SO,似乎for退出循环时文件是否关闭取决于实现?而且我找不到有关此构造如何处理异常的任何信息。有人知道吗?

如果我对上述任何内容有误,我将不胜感激,否则有理由forwith? (假设你有选择,即不受Python版本限制)

4

3 回答 3

33

这个问题

for line in open('data.txt'):
   # etc

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

所以你可以说

inf = open('data.txt')
for line in inf:
   # etc
inf.close()

现在如果在 for 循环中出现异常会发生什么?该文件不会被明确关闭。

添加一个try/finally

inf = open('data.txt')
try:
    for line in inf:
       # etc
finally:
    inf.close()

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

with open('data.txt') as inf:
    for line in inf:
       #etc

因此,这是打开文件的首选方式。如果你的 Python 对于 with 语句来说太旧了,你应该使用try/finally生产代码的版本

于 2012-06-21T02:32:06.963 回答
3

with 语句仅在 Python 2.5 中引入 - 只有当您对早期版本有向后兼容性要求时,您才应该使用后者。

更清晰一点

引入了 with 语句(如您所知)以包含 try/except/finally 系统 - 这不是很好理解,但没关系。在 Python(C 中的 Python)中,它的实现将关闭打开的文件。语言本身的规范并没有说......所以IPython,JPython等......可以选择保持文件打开,内存打开等等,而不是在下一个GC周期之前释放资源(或者根本没有,但是CPython GC 不同于 .NET 或 Java 的...)。

我认为我听到的唯一反对它的是它增加了另一个缩进级别。

所以总结一下:在 2.5 中不起作用,引入了 'as' 关键字并添加了缩进级别。

否则,您可以正常控制异常处理,并且 finally 块会在发生异常时关闭资源。

为我工作!

于 2012-06-21T01:12:24.980 回答
-3
import os

path = "c:\\fio"
longer_path = "c:\\fio\\"
# Read every file in directory
for filename in os.listdir(path):
    print()
    print("Here is the file name",filename)
    inf = open(longer_path+filename)
    try:
        for line in inf:
            print(line,end='')
    finally:
        inf.close()

#output
Here is the file name a.txt
mouse
apple
Here is the file name New Text Document - Copy.txt
cat
Here is the file name New Text Document.txt
dog
于 2018-04-11T02:46:46.770 回答