每当我在这里运行代码片段时,它都会打印" 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)
实际上没有代码可以关闭任何内容。
答案 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
语句中使用生成器,并将所有内容存储在列表中,当然,即使文件消失,该列表仍然存在,并占用内存。
如果可能的话,你想要做的可能是第一次修复的一些变化,否则第二次修改会有一些变化。但是,如果没有看到任何代码,就没有办法告诉你任何更具体的代码。