Сейчас использую:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Но чтобы код выглядел лучше, я могу:
output = open('pagehead.section.htm','r').read()
Как при использовании указанного выше синтаксиса закрыть файл, чтобы освободить системные ресурсы?
contents = os.readfile(path)
. Если бы я хотел сделать что-то более интересное, то хорошо, я бы с радостью использовалwith open(path) as fd: contents = fd.read()
. Конечно, можно написать свою собственную оболочку, но для этого предназначено ядро, чтобы предоставить программистам полезные абстракции.Ответы:
Вам действительно не нужно закрывать его - Python сделает это автоматически либо во время сборки мусора, либо при выходе из программы. Но, как заметил @delnan, лучше явно закрыть его по разным причинам.
Итак, что вы можете сделать, чтобы он был кратким, простым и ясным:
Теперь это всего две строчки, и я думаю, они довольно читабельны.
источник
with
оператор, файловый ресурс будет закрыт для вас правильно.output = f.read()
часть на той же строке после:
.Модуль Pathlib стандартной библиотеки Python делает то, что вы ищете:
Не забудьте импортировать Path:
На Python 27 установите backported
pathlib
илиpathlib2
источник
with
хороши, ноwith
это утверждение, а не выражение. Этотpathlib
ответ - единственный ответ на исходный вопрос, который можно встроить в выражение Python. Что-то вродеSECRET_KEY = os.environ.get('SECRET_KEY') or pathlib.Path('SECRET_KEY').read_bytes()
Используя CPython, ваш файл будет закрыт сразу после выполнения строки, потому что файловый объект немедленно удаляется сборщиком мусора. Однако есть два недостатка:
В реализациях Python, отличных от CPython, файл часто закрывается не сразу, а позже, вне вашего контроля.
В Python 3.2 или более поздних версиях это вызовет ошибку
ResourceWarning
, если она включена.Лучше вложить одну дополнительную линию:
Это гарантирует правильное закрытие файла при любых обстоятельствах.
источник
Для этого не нужно импортировать какие-либо специальные библиотеки.
Используйте обычный синтаксис, и он откроет файл для чтения, а затем закроет его.
или
который дает вам массив x, содержащий строки, и может быть напечатан так:
Эти однострочные сообщения очень полезны для обслуживания - в основном самодокументируются.
источник
Что вы можете сделать, так это использовать
with
оператор и написать два шага в одной строке:with
Заявление будет заботиться , чтобы вызова__exit__
функции данного объекта , даже если что - то плохое случилось в вашем коде; это близко кtry... finally
синтаксису. Для объекта, возвращенногоopen
,__exit__
соответствует закрытию файла.Этот оператор был введен в Python 2.6.
источник
with
был введен в Python 2.5, но должен был быть явно импортирован из__future__
. Он стал доступен во всех контекстах Python 2.6.используйте ilio : (inline io):
только один вызов функции вместо файлов open (), read (), close ().
источник
Я думаю, что наиболее естественный способ добиться этого - определить функцию.
Тогда вы можете сделать следующее:
источник
источник
python -c
в командной строке, поэтому публикация двухстрочных ответов не помогает."
, использовать;
для добавления двух инструкций и удаления новой строки после:
? Следующее выражение отлично подходит для меня:$> python -c "with open('some file', 'r') as f: print(next(f))"
Я часто делаю что-то подобное, когда мне нужно получить несколько строк, окружающих то, что я нашел в файле журнала:
источник
grep -A <n>
,grep -B <n>
иgrep -C <n>
, если это полезно. Дополнительная информация: stackoverflow.com/a/9083/1830159Используя
more_itertools.with_iter
, можно открывать, читать, закрывать и назначать эквивалентoutput
в одной строке (исключая оператор импорта):Хотя это возможно, я бы поискал другой подход, отличный от присвоения содержимого файла переменной, то есть ленивую итерацию - это можно сделать с помощью традиционного
with
блока или, в приведенном выше примере, путем удаленияjoin()
и повторенияoutput
.источник
"".join(line for line in __import__('more_itertools').with_iter(open("pagehead.section.htm", "r")))
Это отлично работает и устраняет необходимость в строке для импорта.Если вы хотите , чтобы тепло и нечеткое чувство просто пойти с с .
Для python 3.6 я запустил эти две программы с новым запуском IDLE, получив время выполнения:
Так что особой разницы нет.
ВЫВОД:
ВЫВОД:
источник