programing

전체 파일을 읽으면 파일 핸들이 열린 상태로 유지됩니까?

yoursource 2022. 9. 4. 23:22
반응형

전체 파일을 읽으면 파일 핸들이 열린 상태로 유지됩니까?

파일 전체를 읽을 경우content = open('Path/to/file', 'r').read()파일 핸들은 스크립트가 종료될 때까지 열려 있습니까?파일 전체를 읽을 수 있는 더 간결한 방법이 있나요?

이 질문에 대한 답은 특정 Python 구현에 따라 달라집니다.

이 모든 것을 이해하려면 실제에 특히 유의하십시오.file물건.코드에서는 그 오브젝트는 식에서1번만 언급되며, 그 직후에 액세스 할 수 없게 됩니다.read()콜이 반환됩니다.

이는 파일 개체가 가비지임을 의미합니다.남은 질문은 "가비지 컬렉터는 언제 파일 개체를 수집합니까?"뿐입니다.

기준 카운터를 사용하는 CPython에서는 이러한 종류의 쓰레기가 즉시 발견되어 즉시 수집됩니다.이것은 일반적으로 다른 python 구현에서는 해당되지 않습니다.

파일이 닫혀 있는지 확인하기 위한 더 좋은 방법은 다음과 같습니다.

with open('Path/to/file', 'r') as content_file:
    content = content_file.read()

블록이 종료된 직후에 항상 파일이 닫힙니다(예외가 발생하더라도).

편집: 자세히 설명하자면:

이외에file.__exit__()이것은, 「자동」으로 호출됩니다.with콘텍스트 매니저 설정, 다른 방법으로는file.close()자동으로 호출됩니다(즉, 사용자가 명시적으로 호출하는 것 이외).file.__del__()이 때문에, 「언제인가」라고 하는 의문이 생깁니다.__del__()호출을 받습니까?

올바르게 작성된 프로그램에서는 프로그램 종료 전에 파이널라이저가 실행된다고 가정할 수 없습니다.

-- https://devblogs.microsoft.com/oldnewthing/20100809-00/ ?p = 13203

특히:

오브젝트는 명시적으로 파기되는 일은 없지만 도달할 수 없게 되면 가비지가 수집될 수 있습니다.구현에서는 가비지 수집을 연기하거나 아예 생략할 수 있습니다.가비지 수집을 구현하는 방법은 아직 도달할 수 있는 개체가 없는 한 구현 품질의 문제입니다.

[...]

CPython은 현재 주기적으로 연결된 가비지 탐지가 지연된 참조 카운트 방식을 사용합니다. 이 방식은 대부분의 개체가 도달할 수 없게 되는 즉시 수집되지만 순환 참조를 포함하는 가비지 수집은 보장되지 않습니다.

-- https://docs.python.org/3.5/reference/datamodel.html#objects-values-and-types

(강조 지뢰)

다만, 다른 실장에도 다른 동작이 있는 경우가 있습니다.예를 들어, PyPy에는 6가지 다른 쓰레기 수집 구현있습니다!

pathlib을 사용할 수 있습니다.

Python 3.5 이상의 경우:

from pathlib import Path
contents = Path(file_path).read_text()

이전 버전의 Python의 경우 pathlib2를 사용합니다.

$ pip install pathlib2

그 후, 다음과 같이 입력합니다.

from pathlib2 import Path
contents = Path(file_path).read_text()

의 ★★★★★★★★★★★★★★★★★★★★★★★.read_text 구현:

def read_text(self, encoding=None, errors=None):
    """
    Open the file in text mode, read it, and close the file.
    """
    with self.open(mode='r', encoding=encoding, errors=errors) as f:
        return f.read()

파일을 한 줄씩 읽어야 할 경우 파일을 한 줄씩 읽을 수 있습니다.

with open('Path/to/file', 'r') as f:
    s = f.readline()
    while s:
        # do whatever you want to
        s = f.readline()

또는 더 나은 방법:

with open('Path/to/file') as f:
    for line in f:
        # do whatever you want to

파일 내용을 단일 문자열로 검색하는 대신 파일을 구성하는 모든 줄의 목록으로 저장하는 것이 편리합니다.

with open('Path/to/file', 'r') as content_file:
    content_list = content_file.read().strip().split("\n")

바와 같이, ' 방식'을 ..strip().split("\n")스레드의 주요 답변에 대한 설명입니다.

서서,,.strip()의 끝에 문자 및 줄바꿈 또, 「」는 「 및 줄바꿈 문자」.split("\n") 줄바꿈 문자마다 파일 문자열 전체를 분할하여 실제 목록을 생성합니다.\ n

또한 이 방법으로 파일 내용 전체를 변수에 저장할 수 있습니다.이러한 답변에서 설명한 바와 같이 한 줄씩 파일을 루프하는 것이 아니라 경우에 따라서는 바람직한 경우도 있습니다.

언급URL : https://stackoverflow.com/questions/7409780/does-reading-an-entire-file-leave-the-file-handle-open

반응형