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

2024-05-16 08:17:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图理解这两者之间的取舍/区别 打开文件进行逐行处理的方法

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

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

我知道使用with可以确保在 “带座”(套房?)已退出(或已取消异常)。所以自从我在这里了解到它以来,我一直在使用with

Refor循环:从搜索网络等方面来看,文件是否 当for循环退出时是否关闭-依赖于实现?以及 我找不到任何关于这个结构将如何处理的信息 例外情况。有人知道吗?

如果我在上面的任何地方弄错了,我会感激你的改正, 否则,是否有理由在 with?(假设您有选择,即不受Python版本的限制)


Tags: 文件方法intxtfordataaswith
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

这个问题

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,使这段代码能够以更可读的方式编写。把我们带到这里

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

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

with语句仅在Python2.5中引入—仅当您对早期版本有向后兼容性要求时才应使用后者。

更清晰一点

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

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

因此总结一下:woll't work<;2.5引入了“as”关键字并添加了缩进级别。

否则,您将保持正常处理异常的控制权,如果发生异常,finally块将关闭资源。

对我有用!

相关问题 更多 >