2013-07-26 3 views
1

Я видел эту идиому в Dive Into Python 3:Закрыть файл при создании списка из открытых()

l = list(open('strcpy.c')) 

Вопрос заключается в том, как я могу close файл?

Что-то происходит за кулисами?

Я не мог найти эту информацию в книге.

+0

так как нет указателей на открытую файловую дескриптор, я думаю, что просто мусор собирает на следующем проходе ... –

ответ

4

Файл будет закрыт, когда его объектом является сборщиком мусора. В CPython это происходит почти сразу после выполнения этой строки, поскольку файл никогда не назначается переменной. В других Pythons, таких как Jython или IronPython, это может не произойти сразу (или вообще), хотя все открытые файлы всегда закрываются, когда процесс завершается.

По этой причине, лучший подход, чтобы закрыть файл явно, используя «с»:

with open("strcpy.c") as infile: 
    l = list(infile) 

Преимуществом этого является то, что файл будет закрыт, даже если исключение происходит в чтении; вам не нужно вручную писать код для этого случая, используя блок try/except.

Заявление with может быть написано на одной строке, если вы хотите придерживаться краткой однострочной линии. :-)

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

+0

Хех, 3 одинаковых ответа одновременно. Это лучший из них. –

+0

это самое лучшее :), это на самом деле объясняет, что это gc'd ... и в cython это почти сразу. –

+0

Спасибо за понимание на 'CPython'. Слишком плохо, что «найти дубликат» спорта так быстро! Интересно, какую интересную информацию я мог бы потерять, если бы это было немного быстрее: D. –

2

От doc:

Это хорошая практика, чтобы использовать с ключевым словом при работе с файлом объектов. Это имеет то преимущество, что файл правильно закрыт после завершения , даже если в пути возникло исключение.

Вы можете использовать его как это:

with open('strcpy.c') as f: 
    l = list(f) 
2

Лично я бы никогда открыть файл без менеджера контекста:

with open('strcpy.c') as myfile: 
    l = list(myfile) 
# do stuff with l here 

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

+0

открытие для чтения не блокирует файлы. также с cython 'list (open (...))' будет мусор собирать FH почти сразу. его не такой кардинальный грех, чтобы сделать что-то вроде 'list (open (...))', как вы это сделаете ... (+1 все равно, поскольку contextmanager - лучшая форма) –

Смежные вопросы