Закрывает ли следующий синтаксис файл:
lines = [line.strip() for line in open('/somefile/somewhere')]
Бонусные баллы, если вы можете продемонстрировать, как это происходит или нет...
ТИА!
Закрывает ли следующий синтаксис файл:
lines = [line.strip() for line in open('/somefile/somewhere')]
Бонусные баллы, если вы можете продемонстрировать, как это происходит или нет...
ТИА!
Он должен закрыть файл, да, хотя, когда именно он делает это, зависит от реализации. Причина в том, что после окончания понимания списка нет ссылки на открытый файл, поэтому он будет собирать мусор, и это закроет файл.
В cpython (версия обычного интерпретатора от python.org) это произойдет немедленно, так как сборщик мусора работает по подсчету ссылок. В другом интерпретаторе, таком как Jython или Iron Python, может быть задержка.
Если вы хотите убедиться, что ваш файл закрыт, гораздо лучше использовать оператор with
:
with open("file.txt") as file:
lines = [line.strip() for line in file]
Когда конец with
завершается, файл будет закрыт. Это верно, даже если в нем возникает исключение.
Вот как вы должны это делать
with open('/somefile/somewhere') as f:
lines = [line.strip() for line in f]
В CPython файл должен быть немедленно закрыт, поскольку ссылки на него отсутствуют, но Язык Python не гарантирует этого.
В Jython файл не будет закрыт, пока сборщик мусора не запустит
Это не так. Менеджер контекста может быть использован для автоматического закрытия. Например:
with open('/somefile/somewhere') as handle:
lines = [line.strip() for line in handle]
Это можно прочитать и закрыть файл в понимании списка с помощью more_itertools
библиотека 1:
import more_itertools as mit
lines = [line.strip() for line in mit.with_iter(open("/somefile/somewhere"))]
Примечание more_itertools
- сторонний пакет. Установите через pip install more_itertools
.
См. также документацию для более подробной информации о more_itertools.with_iter
.
Да, потому что "open" не привязывает дескриптор файла к любому объекту, он будет закрыт, как только понимание списка будет завершено по мере того, как оно выходит за рамки:
#!/usr/bin/env python3
import psutil
print('before anything, open files: ', end='')
print(psutil.Process().open_files())
f = open('/etc/resolv.conf')
print('after opening resolv.conf, open files: ', end='')
print(psutil.Process().open_files())
f.close()
print('after closing resolv.conf, open files: ', end='')
print(psutil.Process().open_files())
print('reading /etc/services via a list comprehension')
services = [ line.strip() for line in open('/etc/services') ]
print('number of items in services: ', end='')
print(len(services))
print('after reading /etc/services through list comp, open files: ', end='')
print(psutil.Process().open_files())