[python] 한 줄의 코드로 파일 읽기 및 닫기

이제는 다음을 사용합니다.

pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()

그러나 코드를 더 좋아 보이게하려면 다음을 수행하십시오.

output = open('pagehead.section.htm','r').read()

위의 구문을 사용할 때 시스템 리소스를 확보하기 위해 파일을 닫으려면 어떻게해야합니까?



답변

실제로 닫을 필요는 없습니다. 파이썬은 가비지 수집 중이나 프로그램 종료시 자동으로 처리합니다. 그러나 @delnan이 지적했듯이 여러 가지 이유로 명시 적으로 닫는 것이 좋습니다.

따라서 짧고 간단하며 명시 적으로 유지하기 위해 할 수있는 일 :

with open('pagehead.section.htm','r') as f:
    output = f.read()

이제는 두 줄에 불과하고 읽기 쉽습니다.


답변

Python Standard Library Pathlib 모듈은 원하는 것을 수행합니다.

Path('pagehead.section.htm').read_text()

Path를 가져 오는 것을 잊지 마십시오 :

jsk@dev1:~$ 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'

Python 27에서 백 포트 설치 pathlib또는pathlib2


답변

CPython을 사용하면 파일 오브젝트가 즉시 가비지 수집되므로 행이 실행 된 직후 파일이 닫힙니다. 그러나 두 가지 단점이 있습니다.

  1. CPython과 다른 Python 구현에서 파일은 종종 즉시 닫히지 않고 나중에 제어 할 수없는 범위에서 닫힙니다.

  2. Python 3.2 이상에서 ResourceWarning활성화하면을 발생시킵니다.

하나의 추가 라인을 투자하는 것이 좋습니다.

with open('pagehead.section.htm','r') as f:
    output = f.read()

이렇게하면 모든 상황에서 파일이 올바르게 닫힙니다.


답변

이를 위해 특별한 라이브러리를 가져올 필요가 없습니다.

일반 구문을 사용하면 파일을 읽고 닫을 수 있습니다.

with open("/etc/hostname","r") as f: print f.read() 

또는

with open("/etc/hosts","r") as f: x = f.read().splitlines()

이것은 행을 포함하는 배열 x를 제공하며 다음과 같이 인쇄 할 수 있습니다.

for line in x: print line

이 단일 라이너는 유지 관리에 매우 유용합니다. 기본적으로 자체 문서화입니다.


답변

당신이 할 수있는 일은 with문장 을 사용하고 한 줄에 두 단계를 쓰는 것입니다.

>>> with open('pagehead.section.htm', 'r') as fin: output = fin.read();
>>> print(output)
some content

with문장은 __exit__코드에 문제가 발생하더라도 주어진 객체의 함수 를 호출하도록주의를 기울입니다 . try... finally구문에 가깝습니다 . 에 의해 반환 된 개체를 들어 open, __exit__파일 폐쇄에 해당합니다.

이 문장은 Python 2.6에서 도입되었습니다.


답변

ilio 사용 : (inline io) :

open (), read (), close () 대신 하나의 함수 호출.

from ilio import read

content = read('filename')


답변

with open('pagehead.section.htm')as f:contents=f.read()