programing

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

skycolor 2023. 6. 6. 08:08
반응형

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

이제 사용:

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을 사용하면 파일 개체가 즉시 가비지 수집되므로 줄이 실행된 후 즉시 파일이 닫힙니다.하지만 다음과 같은 두 가지 단점이 있습니다.

  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에 도입되었습니다.

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

반응형