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