한 줄의 코드로 파일 읽기 및 닫기
이제 사용:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
하지만 코드를 더 잘 보이게 하기 위해, 저는 다음을 할 수 있습니다.
output = open('pagehead.section.htm','r').read()
위 구문을 사용할 때 시스템 리소스를 확보하기 위해 파일을 닫으려면 어떻게 해야 합니까?
당신은 그것을 닫을 필요가 없습니다 - Python은 가비지 수집이나 프로그램 종료 시 자동으로 그것을 할 것입니다.그러나 @delnan이 지적했듯이 다양한 이유로 인해 명시적으로 종료하는 것이 좋습니다.
따라서 짧고 단순하며 명시적으로 유지하기 위해 할 수 있는 것은 다음과 같습니다.
with open('pagehead.section.htm', 'r') as f:
output = f.read()
이제 두 줄로 되어 있고 꽤 읽을 수 있을 것 같습니다.
Python 표준 라이브러리 Pathlib 모듈은 다음과 같은 작업을 수행합니다.
Path('pagehead.section.htm').read_text()
경로를 가져오는 것을 잊지 마십시오.
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에서 backported 설치 또는
CPython을 사용하면 파일 개체가 즉시 가비지 수집되므로 줄이 실행된 후 즉시 파일이 닫힙니다.하지만 다음과 같은 두 가지 단점이 있습니다.
CPython과 다른 Python 구현에서는 파일이 즉시 닫히지 않고 나중에 제어할 수 없는 경우가 많습니다.
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에 도입되었습니다.
use ilio: (delocio):
file open, read, close 대신 하나의 함수 호출만 가능
from ilio import read
content = read('filename')
이를 달성하기 위한 가장 자연스러운 방법은 함수를 정의하는 것이라고 생각합니다.
def read(filename):
f = open(filename, 'r')
output = f.read()
f.close()
return output
그런 다음 다음을 수행할 수 있습니다.
output = read('pagehead.section.htm')
with open('pagehead.section.htm')as f:contents=f.read()
로그 파일에서 가져온 항목에 대해 몇 개의 줄을 표시해야 할 때 다음과 같은 작업을 자주 수행합니다.
$ 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
를 사용하여 동등한 값을 열고, 읽고, 닫고, 할당할 수 있습니다.output
줄로 제외): 한줄수(수입 명세서 제외):
import more_itertools as mit
output = "".join(line for line in mit.with_iter(open("pagehead.section.htm", "r")))
가능하기는 하지만 파일의 내용을 변수에 할당하는 것 외에 다른 접근법(예: 게으른 반복)을 찾고 싶습니다. 이것은 전통적인 방법을 사용하여 수행할 수 있습니다.with
에서 단하거위예제에통거를 합니다.join()
반복 및복output
.
만약 당신이 그 따뜻하고 흐릿한 느낌을 원한다면 그냥 그것과 함께 하세요.
python 3.6의 경우 IDLE을 새로 시작하여 이 두 프로그램을 실행하여 실행 시간을 다음과 같이 제공했습니다.
0.002000093460083008 Test A
0.0020003318786621094 Test B: with guaranteed close
큰 차이는 없습니다.
#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Test A for reading a text file line-by-line into a list
#--------*---------*---------*---------*---------*---------*---------*---------*
import sys
import time
# # MAINLINE
if __name__ == '__main__':
print("OK, starting program...")
inTextFile = '/Users/Mike/Desktop/garbage.txt'
# # Test: A: no 'with;
c=[]
start_time = time.time()
c = open(inTextFile).read().splitlines()
print("--- %s seconds ---" % (time.time() - start_time))
print("OK, program execution has ended.")
sys.exit() # END MAINLINE
출력:
OK, starting program...
--- 0.002000093460083008 seconds ---
OK, program execution has ended.
#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Test B for reading a text file line-by-line into a list
#--------*---------*---------*---------*---------*---------*---------*---------*
import sys
import time
# # MAINLINE
if __name__ == '__main__':
print("OK, starting program...")
inTextFile = '/Users/Mike/Desktop/garbage.txt'
# # Test: B: using 'with'
c=[]
start_time = time.time()
with open(inTextFile) as D: c = D.read().splitlines()
print("--- %s seconds ---" % (time.time() - start_time))
print("OK, program execution has ended.")
sys.exit() # END MAINLINE
출력:
OK, starting program...
--- 0.0020003318786621094 seconds ---
OK, program execution has ended.
언급URL : https://stackoverflow.com/questions/8011797/open-read-and-close-a-file-in-1-line-of-code
'programing' 카테고리의 다른 글
Float 및 google_sign_in 플러그인:플랫폼예외(sign_in_failed, com.google.android.gms.common.api).ApiException: 10: , null) (0) | 2023.06.06 |
---|---|
WPF 창이 닫혔는지 어떻게 알 수 있습니까? (0) | 2023.06.06 |
dplyr을 사용하여 각 그룹에서 최대값이 있는 행을 선택하는 방법은 무엇입니까? (0) | 2023.06.06 |
numpy dot()와 Python 3.5+ 행렬 곱셈의 차이 @ (0) | 2023.06.06 |
Python에서 오류 없이 유니코드를 ASCII로 변환 (0) | 2023.06.06 |