Открыть чтение и закрыть файл в 1 строке кода
Теперь я использую:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Но чтобы код выглядел лучше, я могу сделать:
output = open('pagehead.section.htm','r').read()
При использовании приведенного выше синтаксиса, как закрыть файл, чтобы освободить системные ресурсы?
Ответы
Ответ 1
Вам действительно не нужно закрывать его - Python будет делать это автоматически либо во время сбора мусора, либо при выходе из программы. Но, как отметил @delnan, лучше практиковать явно закрыть его по разным причинам.
Итак, что вы можете сделать, чтобы сделать его коротким, простым и явным:
with open('pagehead.section.htm','r') as f:
output = f.read()
Теперь это просто две строки и довольно читаемые, я думаю.
Ответ 2
Используя CPython, ваш файл будет закрыт сразу же после выполнения строки, поскольку файл файл сразу же собирает мусор. Есть два недостатка:
-
В реализациях Python, отличных от CPython, файл часто не закрывается сразу, а скорее позже, вне вашего контроля.
-
В Python 3.2 или выше это вызовет ResourceWarning
, если включено.
Лучше инвестировать одну дополнительную строку:
with open('pagehead.section.htm','r') as f:
output = f.read()
Это гарантирует, что файл будет правильно закрыт при любых обстоятельствах.
Ответ 3
Что вы можете сделать, так это использовать инструкцию with
:
>>> with open('pagehead.section.htm', 'r') as fin:
... output = fin.read()
Оператор with
позаботится о вызове функции __exit__
данного объекта, даже если что-то случилось в вашем коде; он близок к синтаксису try... finally
. Для объекта, возвращаемого open
, __exit__
соответствует закрытию файла.
Этот оператор был введен с Python 2.6.
Ответ 4
Стандартная библиотека Python Pathlib модуль выполняет то, что вы ищете:
[email protected]:~$ python3
Python 3.5.2 (default, Sep 10 2016, 08:21:44)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pathlib import Path
>>> (Path("/etc") / "hostname").read_text()
'dev1.example\n'
Ответ 5
используйте ilio: (inline io):
только один вызов функции вместо файла open(), read(), close().
from ilio import read
content = read('filename')
Ответ 6
with open('pagehead.section.htm')as f:contents=f.read()
Ответ 7
Я часто делаю что-то подобное, когда мне нужно получить несколько строк, окружающих что-то, что я нашел в файле журнала:
$ grep -n "xlrd" requirements.txt | awk -F ":" '{print $1}'
54
$ python -c "with open('requirements.txt') as file: print ''.join(file.readlines()[52:55])"
wsgiref==0.1.2
xlrd==0.9.2
xlwt==0.7.5
Ответ 8
Используя more_itertools.with_iter
, можно открыть, прочитать, закрыть и присвоить эквивалент output
в одной строке (исключая import):
import more_itertools as mit
output = "".join(line for line in mit.with_iter(open("pagehead.section.htm", "r")))
Хотя возможно, я бы искал другой подход, отличный от назначения содержимого файла переменной, т.е. ленивой итерации - это можно сделать с помощью традиционного блока with
или в примере выше, удалив join()
и итерация output
.
Ответ 9
Не нужно ничего импортировать.
Просто используйте обычный синтаксис, и он откроет файл для чтения, а затем закроет его.
with open("/etc/hostname","r") as f: print f.read()
или
with open("/etc/hosts","r") as f: x = f.read().splitlines()
который дает вам массив x, содержащий строки, которые могут быть напечатаны так:
for i in range(len(x)): print x[i]
Эти однострочные линии очень очевидны.