programing

명시적으로 파일을 닫는 것이 중요합니까?

minimums 2023. 6. 27. 22:02
반응형

명시적으로 파일을 닫는 것이 중요합니까?

에서 Python을 호출하지 을 열 close() 파일을 닫지는 .try-finally는또▁"".with진술, 이것이 문제입니까?아니면 모든 파일을 닫기 위해 파이썬 가비지 컬렉션에 의존하는 것이 코딩 관행으로 충분합니까?예를 들어, 다음과 같은 작업을 수행합니다.

for line in open("filename"):
    # ... do stuff ...

파일을 절대 닫을 수 없고 파일을 닫을 수 없는 예외가 발생할 수 있기 때문에 문제가 있습니까?아니면 그것이 확실히 끝날 때 닫힐 것인가요?for파일이 범위를 벗어났기 때문에 진술하는 것입니까?

이 예에서는 인터프리터가 종료되기 전에 파일을 닫을 수 없습니다.CPython의 현재 버전에서는 참조 카운트를 기본 가비지 수집 메커니즘으로 사용하지만 이는 구현 세부사항이지 언어의 기능이 아닙니다.Python의 다른 구현은 이러한 방식으로 작동하지 않습니다.예를 들어 IronPython, PyPy 및 Jython은 참조 카운트를 사용하지 않으므로 루프 끝에서 파일을 닫지 않습니다.

CPython의 가비지 컬렉션 구현에 의존하는 것은 코드 이동성을 저하시키기 때문에 나쁜 관행입니다.CPython을 사용하면 리소스 누수가 발생하지 않을 수 있지만, 참조 카운팅을 사용하지 않는 Python 구현으로 전환할 경우 모든 코드를 검토하고 모든 파일이 올바르게 닫혔는지 확인해야 합니다.

예를 들어 다음을 사용합니다.

with open("filename") as f:
     for line in f:
        # ... do stuff ...

일부 Python은 더 이상 참조되지 않을 때 파일을 자동으로 닫는 반면, 다른 Python은 그렇지 않으며 Python 인터프리터가 종료될 때 파일을 닫는 것은 OS에 달려 있습니다.

파일을 닫는 Pythons의 경우에도 타이밍이 보장되지 않습니다. 즉, 즉시 또는 몇 초/분/시간/일 후가 될 수 있습니다.

따라서 사용 중인 Python에 문제가 없을 수도 있지만 파일을 열어두는 것은 좋은 방법이 아닙니다.실제로 cpython 3에서는 파일을 닫지 않은 경우 시스템에서 파일을 닫아야 한다는 경고 메시지가 표시됩니다.

도덕적: 자신의 뒤를 깨끗이 하라.:)

이 경우 이러한 구조를 사용하는 것이 상당히 안전하지만, 이러한 관행을 일반화하기 위한 몇 가지 주의 사항이 있습니다.

  • 실행은 파일 설명자가 부족할 수 있습니다. 가능성은 낮지만, 그런 버그를 사냥하는 것을 상상해 보십시오.
  • 일부 시스템(예: win32)에서는 해당 파일을 삭제할 수 없습니다.
  • CPython 이외의 다른 것을 실행하면 파일이 언제 닫혔는지 알 수 없습니다.
  • 쓰기 또는 읽기/쓰기 모드에서 파일을 열면 데이터가 플러시되는 시기를 알 수 없습니다.

파일이 가비지를 수집하므로 닫힙니다.GC는 당신이 아니라 언제 닫히는지 결정합니다.파일 사용을 마치는 즉시 파일을 닫지 않으면 열려 있는 파일 핸들 제한에 도달할 수 있으므로 권장되지 않습니다. 그 안있요면다 요?for당신의 루프, 당신은 더 많은 파일을 열고 그것들을 남겨두나요?

안녕하세요 동일한 파이썬 스크립트에서 파일 설명자의 콘텐츠를 사용하려는 상황에서 파일 설명자를 닫는 것이 매우 중요합니다.저는 오늘 오랜 시간 동안 디버깅을 한 후에 말이죠.그 이유는 파일 설명자를 닫은 후에만 내용이 편집/제거/저장되고 변경사항이 파일에 영향을 미치기 때문입니다.

따라서 새 파일에 내용을 쓴 다음 fd를 닫지 않고 해당 내용을 읽는 다른 셸 명령에서 해당 파일(fd가 아님)을 사용한다고 가정합니다.이러한 상황에서는 셸 명령에 대한 내용을 예상대로 얻을 수 없으며 디버깅을 시도하면 버그를 쉽게 찾을 수 없습니다.당신은 또한 제 블로그 엔트리 http://magnificentzps.blogspot.in/2014/04/importance-of-closing-file-descriptor.html 에서 더 읽을 수 있습니다.

I/O 프로세스 중에 데이터가 버퍼링됩니다. 즉, 데이터는 파일에 쓰기 전에 임시 위치에 유지됩니다.

Python은 쓰기가 완료될 때까지 버퍼를 플러시하지 않습니다. 즉, 파일에 데이터를 씁니다.한 가지 방법은 파일을 닫는 것입니다.

파일을 닫지 않고 쓰면 데이터가 대상 파일에 도달하지 못합니다.

Python은 close() 메서드를 사용하여 열린 파일을 닫습니다.파일이 닫히면 해당 파일의 데이터를 다시 읽거나 쓸 수 없습니다.

동일한 파일에 다시 액세스하려고 하면 파일이 이미 닫혀 있기 때문에 ValueError가 발생합니다.

참조 개체가 다른 파일에 할당된 경우 Python은 자동으로 파일을 닫습니다.파일을 닫는 것은 부당하게 수정될 위험을 줄이기 때문에 일반적인 방법입니다.

이 문제를 해결하는 또 다른 방법은 ...문장을 사용하는 것입니다.

문과 함께 사용하여 파일을 열면 임시 변수가 파일에 액세스하기 위해 예약되고 들여쓰기된 블록으로만 액세스할 수 있습니다.문장 자체가 들여쓰기된 코드를 실행한 후 닫기() 메서드를 호출합니다.

구문:

with open('file_name.text') as file:

    #some code here

언급URL : https://stackoverflow.com/questions/7395542/is-explicitly-closing-files-important

반응형