Python файл закрывается сам - PullRequest
0 голосов
/ 26 апреля 2018

Всякий раз, когда я запускаю здесь фрагмент, он выводит «False» перед тем, как сразу же следовать в строке после «ValueError: операция ввода-вывода для закрытого файла». Есть ли что-нибудь с 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 голосов
/ 26 апреля 2018

Проблема не в этом коде, а в каком-то другом коде, который вы нам не показали.

То, что вы написали, - это создание генератора, который после итерации приведет к удалениюнепустые строки в файле.

Отлично.Но если вы не используете этот генератор до тех пор, пока вы не закроете файл, он попытается извлечь эти строки из закрытого файла.(Помните, весь смысл генераторов в том, что они ленивы - они выполняют всю работу как можно позже, используя как можно меньше памяти.)

Из ваших комментариев этокажется, вы не думаете, что закрываете файл где-либо.Но на самом деле вы есть.Весь смысл использования операторов 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 и сохраняете все в списке, который, конечно, все еще присутствует и занимает память даже после того, как файл исчезнет.


Что вы хотитеdo - это, возможно, некоторое изменение первого исправления, в противном случае - некоторое изменение второго.Но, не видя ни одного вашего кода, невозможно сказать что-то более конкретное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...