Python文件自动关闭

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

每当我在这里运行代码段时,它都会先打印“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 = 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
关闭文件。这就是对文件使用
语句的全部意义。谢谢!我没有意识到我在试着运行发电机。