Будет использовать понимание списка для чтения файла, автоматически вызывающего close()

Закрывает ли следующий синтаксис файл:

lines = [line.strip() for line in open('/somefile/somewhere')]

Бонусные баллы, если вы можете продемонстрировать, как это происходит или нет...

ТИА!

Ответ 1

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

В cpython (версия обычного интерпретатора от python.org) это произойдет немедленно, так как сборщик мусора работает по подсчету ссылок. В другом интерпретаторе, таком как Jython или Iron Python, может быть задержка.

Если вы хотите убедиться, что ваш файл закрыт, гораздо лучше использовать оператор with:

with open("file.txt") as file:
    lines = [line.strip() for line in file]

Когда конец with завершается, файл будет закрыт. Это верно, даже если в нем возникает исключение.

Ответ 2

Вот как вы должны это делать

with open('/somefile/somewhere') as f:
    lines = [line.strip() for line in f]

В CPython файл должен быть немедленно закрыт, поскольку ссылки на него отсутствуют, но Язык Python не гарантирует этого.

В Jython файл не будет закрыт, пока сборщик мусора не запустит

Ответ 3

Это не так. Менеджер контекста может быть использован для автоматического закрытия. Например:

with open('/somefile/somewhere') as handle:
    lines = [line.strip() for line in handle]

Ответ 4

Это можно прочитать и закрыть файл в понимании списка с помощью 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.

Ответ 5

Да, потому что "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())