tempfile — 임시 파일과 디렉터리 생성¶
소스 코드: Lib/tempfile.py
이 모듈은 임시 파일과 디렉터리를 생성합니다. 지원되는 모든 플랫폼에서 작동합니다. TemporaryFile, NamedTemporaryFile, TemporaryFileWrapper, TemporaryDirectory, 그리고 SpooledTemporaryFile 은 자동 정리를 제공하며 컨텍스트 관리자 로 사용할 수 있는 고수준 인터페이스입니다. mkstemp() 및 mkdtemp() 는 수동 정리가 필요한 저수준 함수입니다.
사용자가 호출할 수 있는 모든 함수와 생성자는 임시 파일과 디렉터리의 위치와 이름을 직접 제어할 수 있도록 하는 추가 인자를 취합니다. 이 모듈에서 사용하는 파일 이름에는 무작위 문자의 문자열이 포함되어있어 공유 임시 디렉터리에서 해당 파일을 안전하게 만들 수 있도록 합니다. 이전 버전과의 호환성을 유지하기 위해, 인자 순서는 다소 이상합니다; 명확성을 위해 키워드 인자를 사용하는 것이 좋습니다.
이 모듈은 다음과 같은 사용자 호출 가능 항목을 정의합니다:
- tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
임시 저장 영역으로 사용할 수 있는 파일류 객체를 반환합니다.
mkstemp()와 같은 규칙을 사용하여 파일이 안전하게 만들어집니다. 닫히는 즉시 삭제됩니다 (객체가 가비지 수집될 때 묵시적인 닫기를 포함합니다). 유닉스에서, 파일의 디렉터리 항목은 전혀 만들어지지 않거나 파일이 만들어진 직후에 제거됩니다. 다른 플랫폼은 이를 지원하지 않습니다; 코드는 이 함수를 사용하여 만들어진 임시 파일이 파일 시스템에서 보이는 이름이 있거나 없는지에 의존해서는 안 됩니다.결과 객체는 컨텍스트 관리자로 사용할 수 있습니다 (예를 참조하십시오). 컨텍스트가 완료되거나 파일 객체가 파괴되면 임시 파일이 파일 시스템에서 제거됩니다.
mode 매개 변수는 기본적으로
'w+b'로 설정되므로 만들어진 파일을 닫지 않고 읽고 쓸 수 있습니다. 저장된 데이터와 관계없이 모든 플랫폼에서 일관되게 작동하도록 바이너리 모드가 사용됩니다. buffering, encoding, errors 및 newline은open()처럼 해석됩니다.dir, prefix 및 suffix 매개 변수는
mkstemp()와 같은 의미와 기본값을 갖습니다.반환된 객체는 POSIX 플랫폼에서 실제 파일 객체입니다. 다른 플랫폼에서는,
file어트리뷰트가 하부 실제 파일 객체인 파일류 객체입니다.os.O_TMPFILE플래그는 사용할 수 있고 작동하면 사용됩니다 (리눅스 특정, 리눅스 커널 3.11 이상이 필요합니다).Posix나 Cygwin이 아닌 플랫폼에서 TemporaryFile은 NamedTemporaryFile의 별칭입니다.
인자
fullpath로 감사 이벤트tempfile.mkstemp를 발생시킵니다.버전 3.5에서 변경: 사용할 수 있으면
os.O_TMPFILE플래그가 사용됩니다.버전 3.8에서 변경: errors 매개 변수를 추가했습니다.
- tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None, delete_on_close=True)¶
이 함수는 다음과 같은 차이를 제외하고는
TemporaryFile()과 똑같이 작동합니다:이 함수는 파일 시스템에서 보이는 이름을 가지는 것이 보장되는 파일을 반환합니다.
이름이 지정된 파일을 관리하기 위해, NamedTemporaryFile은 이름이 지정된 파일이 자동으로 삭제되어야 하는지 여부와 그 방식을 결정하는 delete 및 delete_on_close 매개변성을 추가하여
TemporaryFile()의 매개변수를 확장합니다.
반환된 객체는 항상
file어트리뷰트가 하부 실제 파일 객체인TemporaryFileWrapper인스턴스(파일류 객체)입니다. 이 파일류 객체는 일반 파일과 마찬가지로with문에서 사용할 수 있습니다. 임시 파일의 이름은 반환된 파일류 객체의name어트리뷰트에서 확인할 수 있습니다. 유닉스(Unix) 환경에서는TemporaryFile()와 달리 파일 생성 직후에 디렉터리 항목이 즉시 unlink되지 않습니다.If delete is true (the default) and delete_on_close is true (the default), the file is deleted as soon as it is closed. If delete is true and delete_on_close is false, the file is deleted on context manager exit only, or else when the file-like object is finalized. Deletion is not always guaranteed in this case (see
object.__del__()). If delete is false, the value of delete_on_close is ignored.따라서 파일이 닫힌 후에도 해당 이름을 사용하여 다시 열려면, 닫을 때 삭제되지 않도록 설정하거나(delete 를 거짓으로 설정) 또는 컨텍스트 문(
with)에서 임시 파일이 생성되는 경우 delete_on_close 매개변수를 거짓으로 설정하십시오. 후자의 방식은 컨텍스트 관리자 종료 시 임시 파일이 자동으로 정리되는 데 도움이 되므로 권장됩니다.파일이 열려 있는 동안 이름으로 다시 여는 경우 다음과 같이 작동합니다:
POSIX에서는 파일을 언제든지 다시 열 수 있습니다.
Windows의 경우 다음 조건 중 하나 이상이 충족되는지 확인하십시오:
delete 가 거짓인 경우
추가적인 열기가 삭제 액세스 권한을 공유하는 경우(예:
O_TEMPORARY플래그를 사용하여os.open()호출)delete 는 참이지만 delete_on_close 가 거짓인 경우입니다. 이 경우 삭제 액세스 권한을 공유하지 않는 추가적인 열기(예: 내장된
open()으로 생성됨)는 컨텍스트 관리자를 나가기 전에 닫혀야 합니다. 그렇지 않으면 컨텍스트 관리자 종료 시os.unlink()호출이PermissionError로 실패할 수 있습니다.
Windows에서 delete_on_close 가 거짓이고 사용자가 삭제 권한이 없는 디렉터리에 파일이 생성된 경우, 컨텍스트 관리자 종료 시
os.unlink()호출이PermissionError로 실패합니다. delete_on_close 가 참인 경우에는 발생하지 않는데, 이는 열기(open) 시에 삭제 권한을 요청하며 권한이 부여되지 않으면 즉시 실패하기 때문입니다.POSIX 전용 사항으로, SIGKILL로 갑자기 종료된 프로세스는 생성한 어떤 NamedTemporaryFile도 자동으로 삭제할 수 없습니다.
인자
fullpath로 감사 이벤트tempfile.mkstemp를 발생시킵니다.버전 3.8에서 변경: errors 매개 변수를 추가했습니다.
버전 3.12에서 변경: delete_on_close 매개 변수를 추가했습니다.
- class tempfile.TemporaryFileWrapper(file, name, delete=True, delete_on_close=True)¶
NamedTemporaryFile()에 의해 반환되는 가변(mutable) 래퍼입니다. 하부 파일 객체를 감싸고 속성 접근을 전달하며, 적절한 시점에 임시 파일이 삭제되도록 보장합니다.- name¶
임시 파일의 이름입니다.
- close()¶
NamedTemporaryFile()에 전달된 delete 및 delete_on_close 인자에 따라 임시 파일을 닫고 필요시 삭제합니다.
참고
tempfile._TemporaryFileWrapper는 하위 호환성을 위한 오래된 별칭으로 유지됩니다. 이 명칭은 Python 3.21에서 제거될 예정입니다.Added in version 3.16.0a0 (unreleased).
- class tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)¶
이 클래스는 파일 크기가 max_size를 초과할 때까지, 또는 파일의
fileno()메서드가 호출될 때까지 데이터가 메모리에 스풀링 되는 것을 제외하고는TemporaryFile()과 똑같이 작동합니다. 이 시점에서 내용은 디스크에 기록되고TemporaryFile()처럼 작업이 진행됩니다.- rollover()¶
결과 파일에는 추가 메서드인
rollover()가 있으며, 파일 크기와 관계없이 파일을 디스크 상의 파일로 롤오버(roll over) 합니다.
반환된 객체는 파일류 객체인데,
rollover()가 호출되었는지에 따라_file어트리뷰트는io.BytesIO나io.TextIOWrapper객체(바이너리나 텍스트 mode가 지정되었는지에 따라)이거나 실제 파일 객체입니다. 이 파일류 객체는 일반 파일과 마찬가지로with문에서 사용할 수 있습니다.버전 3.3에서 변경: truncate 메서드는 이제 size 인자를 허용합니다.
버전 3.8에서 변경: errors 매개 변수를 추가했습니다.
버전 3.11에서 변경: 지정된 모드 가 바이너리인지 텍스트인지에 따라
io.BufferedIOBase및io.TextIOBase추상 기본 클래스를 완전히 구현합니다.
- class tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True)¶
이 클래스는
mkdtemp()와 같은 규칙을 사용하여 임시 디렉터리를 안전하게 만듭니다. 결과 객체는 컨텍스트 관리자로 사용할 수 있습니다 (예를 참조하십시오). 컨텍스트가 완료되거나 임시 디렉터리 객체가 파괴되면 새로 만들어진 임시 디렉터리와 모든 내용이 파일 시스템에서 제거됩니다.- name¶
반환된 객체의
name어트리뷰트에서 디렉터리 이름을 꺼낼 수 있습니다. 반환된 객체가 컨텍스트 관리자로 사용될 때,name은with문의as절의 대상에 (있다면) 대입됩니다.
- cleanup()¶
cleanup()메서드를 호출하여 디렉터리를 명시적으로 정리할 수 있습니다. ignore_cleanup_errors 가 true인 경우, 명시적 또는 암시적 정리 과정에서 발생하는 처리되지 않은 예외(예: Windows에서 열려 있는 파일을 제거할 때 발생하는PermissionError)는 무시되며, 나머지 삭제 가능한 항목들은 “최대한의 노력”을 다해 삭제됩니다. 그렇지 않으면 정리 작업이 수행되는 상황(명시적인cleanup()호출, 컨텍스트 매니저 종료 시, 객체 가비지 컬렉션 시 또는 인터프리터 종료 시)에서 오류가 발생합니다.
delete 파라미터를 사용하여 컨텍스트를 벗어날 때 디렉터리 트리의 정리를 비활성화할 수 있습니다. 컨텍스트 매니저가 종료될 때 수행되는 동작을 비활성화하는 것이 일반적이지 않게 보일 수 있지만, 디버깅 중이거나 다른 로직에 따라 조건부로 정리 동작을 제어해야 하는 경우 유용할 수 있습니다.
인자
fullpath로 감사 이벤트tempfile.mkdtemp를 발생시킵니다.Added in version 3.2.
버전 3.10에서 변경: ignore_cleanup_errors 매개 변수를 추가했습니다.
버전 3.12에서 변경: delete 매개 변수를 추가했습니다.
- tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)¶
가능한 가장 안전한 방식으로 임시 파일을 생성합니다. 플랫폼이
os.open()에 대해os.O_EXCL플래그를 올바르게 구현한다고 가정할 때, 파일 생성 과정에서 경쟁 조건(race condition)이 발생하지 않습니다. 해당 파일은 생성한 사용자 ID만 읽고 쓸 수 있습니다. 플랫폼이 권한 비트를 사용하여 파일의 실행 가능 여부를 표시하는 경우, 이 파일은 누구도 실행할 수 없습니다.The file descriptor is not inherited by child processes.
TemporaryFile()와 달리,mkstemp()의 사용자는 파일 디스크립터를 닫고(예:os.close()를 사용) 임시 파일을 삭제하는(예:os.remove()를 사용) 책임이 있습니다.suffix가
None이 아니면, 파일 이름은 해당 접미사로 끝납니다, 그렇지 않으면 접미사가 없습니다.mkstemp()는 파일 이름과 접미사 사이에 점을 넣지 않습니다; 필요하면 suffix의 시작 부분에 넣으십시오.prefix가
None이 아니면, 파일 이름은 해당 접두사로 시작합니다; 그렇지 않으면 기본 접두사가 사용됩니다. 기본값은gettempprefix()나gettempprefixb()중 적절한 것의 반환 값입니다.dir이
None이 아니면, 파일은 해당 디렉터리에 만들어집니다; 그렇지 않으면 기본 디렉터리가 사용됩니다. 기본 디렉터리는 플랫폼별 목록에서 선택되지만, 응용 프로그램 사용자는 TMPDIR, TEMP 또는 TMP 환경 변수를 설정하여 디렉터리 위치를 제어할 수 있습니다. 따라서 생성된 파일명이os.popen()을 통해 외부 명령에 전달될 때 따옴표 처리할 필요가 없는 것과 같은 멋진 속성을 가질 것이라는 보장은 없습니다.suffix, prefix 및 dir 중 어느 것이라도
None이 아니면, 그들은 같은 형이어야 합니다. 이들이 바이트열이면, 반환되는 이름은 str 대신 바이트열입니다. 기본 동작으로 바이트열 반환 값을 강제하려면suffix=b''를 전달하십시오.text가 지정되고 참이면, 파일은 텍스트 모드로 열립니다. 그렇지 않으면 (기본값) 파일은 바이너리 모드로 열립니다.
mkstemp()는 열린 파일에 대한 OS 수준 핸들(os.open()에서 반환하는 것)과 해당 파일의 절대 경로를 이 순서대로 포함하는 튜플을 반환합니다.인자
fullpath로 감사 이벤트tempfile.mkstemp를 발생시킵니다.버전 3.5에서 변경: 바이트열 반환 값을 얻기 위해 suffix, prefix 및 dir를 이제 바이트열로 제공할 수 있습니다. 이전에는, str만 허용되었습니다. suffix와 prefix는 이제 기본값이
None이고 적절한 기본값이 사용되도록 합니다.버전 3.6에서 변경: dir 매개 변수는 이제 경로류 객체를 받아들입니다.
- tempfile.mkdtemp(suffix=None, prefix=None, dir=None)¶
가장 안전한 방식으로 임시 디렉터리를 만듭니다. 디렉터리 생성에 경쟁 조건이 없습니다. 디렉터리는 만드는 사용자 ID만 읽고 쓰고 검색할 수 있습니다.
mkdtemp()의 사용자는 임시 디렉터리로의 작업을 끝내면 임시 디렉터리와 디렉터리의 내용을 삭제해야 합니다.prefix, suffix 및 dir 인자는
mkstemp()와 같습니다.mkdtemp()는 새 디렉터리의 절대 경로명을 반환합니다.인자
fullpath로 감사 이벤트tempfile.mkdtemp를 발생시킵니다.버전 3.5에서 변경: 바이트열 반환 값을 얻기 위해 suffix, prefix 및 dir를 이제 바이트열로 제공할 수 있습니다. 이전에는, str만 허용되었습니다. suffix와 prefix는 이제 기본값이
None이고 적절한 기본값이 사용되도록 합니다.버전 3.6에서 변경: dir 매개 변수는 이제 경로류 객체를 받아들입니다.
버전 3.12에서 변경: 이제 dir이 상대 경로일 때도,
mkdtemp()는 항상 절대 경로를 반환합니다.
- tempfile.gettempdir()¶
임시 파일에 사용된 디렉터리 이름을 반환합니다. 이것은 이 모듈의 모든 함수에 대한 dir 인자의 기본값을 정의합니다.
파이썬은 표준 디렉터리 목록을 검색하여 호출하는 사용자가 파일을 만들 수 있는 디렉터리를 찾습니다. 목록은 다음과 같습니다:
TMPDIR환경 변수로 명명된 디렉터리.TEMP환경 변수로 명명된 디렉터리.TMP환경 변수로 명명된 디렉터리.플랫폼별 위치:
윈도우에서, 디렉터리
C:\TEMP,C:\TMP,\TEMP및\TMP, 이 순서대로.다른 모든 플랫폼에서, 디렉터리
/tmp,/var/tmp및/usr/tmp, 이 순서대로.
최후의 수단으로, 현재 작업 디렉터리.
이 검색 결과는 캐시 됩니다, 아래
tempdir설명을 참조하십시오.버전 3.10에서 변경: 항상 str을 반환합니다. 이전에는 타입에 관계없이
None이 아닌 경우라면 어떠한tempdir값이라도 반환했습니다.
- tempfile.gettempdirb()¶
gettempdir()과 같지만, 반환 값이 바이트열입니다.Added in version 3.5.
- tempfile.gettempprefix()¶
임시 파일을 만드는 데 사용된 파일명 접두사를 반환합니다. 디렉터리 구성 요소가 포함되어 있지 않습니다.
- tempfile.gettempprefixb()¶
gettempprefix()와 같지만, 반환 값이 바이트열입니다.Added in version 3.5.
모듈은 전역 변수를 사용하여 gettempdir()이 반환한 임시 파일에 사용되는 디렉터리의 이름을 저장합니다. 선택 절차를 무시하도록 직접 설정할 수 있지만, 권장하지 않습니다. 이 모듈의 모든 함수는 디렉터리를 지정하는 데 사용할 수 있는 dir 인자를 사용합니다. 이는 전역 API 동작을 변경하여 주의하지 않는 다른 코드를 놀라게 하지 않도록 권장되는 방법입니다.
- tempfile.tempdir¶
None이외의 값으로 설정되면, 이 변수는 이 모듈에 정의된 함수의 dir 인자의 기본값을 정의합니다 (형이 바이트열인지 문자열인지도 정의합니다). 경로류 객체일 수 없습니다.gettempprefix()를 제외한 위의 함수를 호출할 때tempdir이None(기본값)이면gettempdir()에 설명된 알고리즘에 따라 초기화됩니다.
예¶
다음은 tempfile 모듈의 일반적인 사용 예시입니다:
>>> import tempfile
# 임시 파일을 만들고 약간의 데이터를 기록합니다
>>> fp = tempfile.TemporaryFile()
>>> fp.write(b'Hello world!')
# 파일에서 데이터를 읽습니다
>>> fp.seek(0)
>>> fp.read()
b'Hello world!'
# 파일을 닫습니다, 삭제됩니다
>>> fp.close()
# 컨텍스트 관리자를 사용해서 임시 파일을 만듭니다
>>> with tempfile.TemporaryFile() as fp:
... fp.write(b'Hello world!')
... fp.seek(0)
... fp.read()
b'Hello world!'
>>>
# 파일은 이제 닫히고 삭제됩니다
# 컨텍스트 관리자를 사용해서 임시 파일을 만듭니다
# 파일을 닫고, 이름을 사용해서 파일을 다십 엽니다
>>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:
... fp.write(b'Hello world!')
... fp.close()
... # 파일은 닫히지만, 삭제되지는 않습니다
... # 이름을 사용해서 파일을 다시 엽니다
... with open(fp.name, mode='rb') as f:
... f.read()
b'Hello world!'
>>>
# 파일은 이제 삭제됩니다
# 컨텍스트 관리자를 사용해서 임시 디렉터리를 만듭니다
>>> with tempfile.TemporaryDirectory() as tmpdirname:
... print('created temporary directory', tmpdirname)
>>>
# 디렉터리와 내용은 삭제되었습니다
폐지된 함수와 변수¶
임시 파일을 만드는 역사적인 방법은 먼저 mktemp() 함수를 사용하여 파일 이름을 생성한 다음 이 이름을 사용하여 파일을 만드는 것입니다. 불행히도 mktemp() 호출과 파일을 만들려는 후속 시도 사이에 다른 프로세스가 이 이름으로 파일을 만들 수 있어서 이 방법은 안전하지 않습니다. 해결책은 두 단계를 결합하고 파일을 즉시 만드는 것입니다. 이 접근법이 mkstemp()와 위에서 설명한 다른 함수에서 사용됩니다.
- tempfile.mktemp(suffix='', prefix='tmp', dir=None)¶
버전 2.3부터 폐지됨: 대신
mkstemp()를 사용하십시오.호출하는 시점에 존재하지 않는 파일의 절대 경로명을 반환합니다. prefix, suffix 및 dir 인자는 바이트열 파일 이름,
suffix=None및prefix=None이 지원되지 않는다는 점을 제외하고mkstemp()의 같은 인자와 유사합니다.경고
이 함수를 사용하면 프로그램에 보안 허점이 생길 수 있습니다. 반환된 파일 이름으로 무언가를 하면서 시간을 보내는 동안, 다른 누군가가 당신에게 펀치를 날릴 수 있습니다.
mktemp()사용은delete=False매개 변수를 전달하여NamedTemporaryFile()로 쉽게 대체할 수 있습니다:>>> f = NamedTemporaryFile(delete=False) >>> f.name '/tmp/tmptjujjt' >>> f.write(b"Hello World!\n") 13 >>> f.close() >>> os.unlink(f.name) >>> os.path.exists(f.name) False