Python文件自动关闭
每当我在这里运行代码段时,它都会先打印“False”,然后紧跟在“ValueError:I/O operation on closed file”之后的行上。rstrip是否有任何东西可以关闭该文件Python文件自动关闭,python,file,io,Python,File,Io,每当我在这里运行代码段时,它都会先打印“False”,然后紧跟在“ValueError:I/O operation on closed file”之后的行上。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
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)
ffile=sys.argv[1]
ifile=sys.argv[2]
sha1=hashlib.sha1()
将open(ifile,'rb')作为f:
尽管如此:
数据=f.read(5000)
如果没有数据:
打破
sha1.更新(数据)
digest=sha1.hexdigest()
摘要_int=int(摘要,16)
以开放式(ffile,'rb')作为f:
打印f关闭
lines=(f中的行的line.rstrip())
行=(行中的行对应行,如果为行)
maxid=0
对于l in行:
节点名称=l.split(“”)[0]
nextid=l.split(“”)[1]
nextid=int(nextid,16)
如果(nextid==digest\u int):
maxid=nextid
打破
elif nextidmaxid:
maxid=nextid
打印str(摘要)
打印str(maxid)
实际上,没有任何代码可以关闭任何东西。问题不在这段代码中,而是在您没有向我们展示的其他代码中 您所写的是创建一个生成器,当迭代时,它将从文件中产生剥离的、非空的行 那很好。但是,如果在关闭文件之前不使用该生成器,它将尝试从关闭的文件中删除这些行。(请记住,生成器的关键在于它们很懒惰—它们尽可能晚地完成所有工作,使用尽可能少的内存。) 从你的评论来看,似乎你认为你没有关闭任何地方的文件。但事实上你是。对文件使用
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
…很好。当文件仍处于打开状态时,您正在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
语句中使用生成器,并将所有内容存储在一个列表中,当然列表仍然存在,即使在文件消失后也会占用内存
如果可能的话,你想做的可能是在第一个补丁上做一些修改,否则在第二个补丁上做一些修改。但是如果没有看到您的任何代码,就无法告诉您任何更具体的信息。没有任何关于
rstrip
的信息会关闭文件rstrip
甚至看不到文件,只看到从中读取的每一行。另外,它在您打印f.closed后才会被调用,因此它做任何事情都为时已晚。但是,由于上一行文件是打开的,因此可能会有东西关闭该文件。除非f.closed为False,否则实际上意味着它是关闭的。您的代码运行良好。下一行代码是什么?问题可能发生在那里。请提供一个示例来说明问题。这意味着我们可以复制代码,将其粘贴到编辑器中,将文件名更改为我们提供的文件,然后运行代码来重现问题。“实际上没有关闭任何东西的代码”是不正确的:with
关闭文件。这就是对文件使用和语句的全部意义。谢谢!我没有意识到我在试着运行发电机。