Python文件关闭其

2024-06-26 14:02:30 发布

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

每当我在这里运行代码段时,它都会在紧跟在“ValueError:I/O operation on closed file”后面的一行之前打印“False”是否有任何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)

没有任何代码可以关闭任何东西。你知道吗


Tags: inforifwithlineopensha1int
1条回答
网友
1楼 · 发布于 2024-06-26 14:02:30

问题不在这段代码中,而是在您没有向我们展示的其他代码中。你知道吗

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

那很好。但是如果在关闭文件之前不使用生成器,它会尝试从关闭的文件中删除这些行。(请记住,生成器的关键是它们非常懒惰,它们尽可能晚地完成所有工作,使用尽可能少的内存。)

从你的评论来看,似乎你不认为你正在关闭任何地方的文件。但事实上你是。对文件使用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语句中使用生成器,并将所有内容存储在一个列表中,当然,列表仍然存在,并且即使在文件消失之后也会占用内存。你知道吗


如果可能的话,你想做的可能是在第一个补丁上的一些变化,否则在第二个补丁上的一些变化。但是如果没有看到你的任何代码,就没有办法告诉你任何更具体的事情。你知道吗

相关问题 更多 >