Python文件自行关闭

时间:2018-04-25 23:46:04

标签: python file io

每当我在这里运行代码片段时,它都会打印" False"在" ValueError:关闭文件后的I / O操作"是否有任何关闭文件的rstrip?

with open(ffile, 'rb') as f:
    print f.closed
    lines = (line.rstrip() for line in f)
    lines = (line for line in lines if line) 

这是整个代码段

ffile = sys.argv[1]
ifile = sys.argv[2]
sha1 = hashlib.sha1()

with open(ifile, 'rb') as f:
    while True:
        data = f.read(5000)
        if not data:
            break
        sha1.update(data)
digest = sha1.hexdigest()
digest_int = int(digest, 16)

with open(ffile, 'rb') as f:
    print f.closed
    lines = (line.rstrip() for line in f)
    lines = (line for line in lines if line) 


maxid = 0
for l in lines:
    node_name = l.split(' ')[0]
    nextid = l.split(' ')[1]
    nextid = int(nextid, 16)
    if (nextid == digest_int):
        maxid = nextid
        break
    elif nextid < digest_int and not("Finger" in node_name):
        if nextid > maxid:
            maxid = nextid

print str(digest_int)
print str(maxid)

实际上没有代码可以关闭任何内容。

1 个答案:

答案 0 :(得分:1)

问题不在于此代码中,而是在您未向我们展示的其他一些代码中。

你所写的是创建一个生成器,当迭代时,它会从文件中产生剥离的非空行。

这很好。但是如果你在关闭文件之前没有使用那个生成器,它将尝试从关闭的文件中获取这些行。 (请记住,生成器的重点在于它们是 lazy - 它们尽可能晚地完成所有工作,使用尽可能少的内存。)

从您的评论中,您似乎认为自己不会在任何地方关闭该文件。但实际上你是。在文件上使用with语句的重点是,一旦退出with正文,它们就会关闭文件。

例如,如果你这样做:

with open(ffile, 'rb') as f:
    print f.closed
    lines = (line.rstrip() for line in f)
    lines = (line for line in lines if line)

for line in lines:
    print line

......这是一个错误,可能与您所看到的错误完全相同。

但是这个:

with open(ffile, 'rb') as f:
    print f.closed
    lines = (line.rstrip() for line in f)
    lines = (line for line in lines if line)

    for line in lines:
        print line

......很好。您在lines语句中使用with,而文件仍处于打开状态。

而且:

with open(ffile, 'rb') as f:
    print f.closed
    lines = (line.rstrip() for line in f)
    lines = (line for line in lines if line)
    lines = list(line)

for line in lines:
    print line

......也没关系。您正在with语句中使用生成器,并将所有内容存储在列表中,当然,即使文件消失,该列表仍然存在,并占用内存。

如果可能的话,你想要做的可能是第一次修复的一些变化,否则第二次修改会有一些变化。但是,如果没有看到任何代码,就没有办法告诉你任何更具体的代码。