Python 逐行文件处理,用于循环vs

Python 逐行文件处理,用于循环vs,python,file-io,for-loop,with-statement,Python,File Io,For Loop,With Statement,我试图了解这些之间的权衡/差异,以便 打开文件进行逐行处理的方法 with open('data.txt') as inf: for line in inf: #etc vs 我了解,将与一起使用可确保文件在 退出“with block”(套件?)(或反异常)。因此,自从我在这里了解它以来,我一直在使用 Refor-循环:从网络周围搜索等,似乎文件 退出-循环的时是否关闭取决于实现?及 我找不到关于这个构造将如何处理的任何信息 例外情况。有人知道吗 如果我对以上任何事情有

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

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

我了解,将
一起使用可确保文件在 退出“with block”(套件?)(或反异常)。因此,自从我在这里了解它以来,我一直在使用

Re
for
-循环:从网络周围搜索等,似乎文件 退出
-循环的
时是否关闭取决于实现?及
我找不到关于这个构造将如何处理的任何信息
例外情况。有人知道吗

如果我对以上任何事情有误解,我将感谢您的纠正, 否则,是否有理由在整个过程中使用
for
构造
?(假设您可以选择,即不受Python版本的限制)

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

更清晰一点

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

我想我听到的唯一反对它的是,它增加了另一个缩进级别

总之:将不起作用<2.5,引入'as'关键字并添加缩进级别

否则,您将像正常情况一样控制异常的处理,如果有什么东西逃逸,finally块将关闭资源

为我工作

这个问题

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()
这是很多代码来完成一些非常简单的事情,因此Python添加了
,以使这段代码能够以更可读的方式编写。这让我们来到这里

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

因此,这是打开文件的首选方式。如果您的Python对于with语句来说太旧,那么应该使用生产代码的
try/finally
版本。。当你在这个问题上有选择的时候,我应该说点什么——也就是说,你不受版本的限制。。我会更新这个问题。那么你的投票结果会是
吗?我认为缩进是一个好处,因为它指定了给定上下文下的部分。您必须以任何方式缩进,以便在一次尝试中包装整个块,除非在最后一次尝试中关闭文件block@jdl这一点很好——但请让大家知道,缩进问题并不是我提出的——只是我几年前在列表和组中提到的一个问题。欢迎使用堆栈溢出!在堆栈溢出问题上,最好添加一个解释,说明解决方案应该工作的原因。欲了解更多信息,请阅读。
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
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