tempfile — 임시 파일과 디렉터리 생성¶
소스 코드: Lib/tempfile.py
이 모듈은 임시 파일과 디렉터리를 만듭니다. 지원되는 모든 플랫폼에서 작동합니다. TemporaryFile, NamedTemporaryFile, 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()과 똑같이 작동합니다:이 함수는 파일 시스템에서 보이는 이름을 가지는 것이 보장되는 파일을 반환합니다.
이것은 `:func:`TemporaryFile`의 매개변수에 delete 및 delete_on_close 매개변수를 확장하여, 이름이 부여된 파일이 자동으로 삭제될지 여부와 그 방식을 결정합니다.
반환된 객체는 항상
file어트리뷰트가 하부 실제 파일 객체인 파일류 객체입니다. 이 파일류 객체는 일반 파일과 마찬가지로with문에서 사용할 수 있습니다. 임시 파일의 이름은 반환된 파일류 객체의name어트리뷰트에서 꺼낼 수 있습니다. 유닉스에서,TemporaryFile()과 달리, 파일 생성 직후에 디렉터리 항목이 삭제(unlink)되지 않습니다.delete*가 True (기본값)이고 *delete_on_close*가 True (기본값)이면, 파일은 닫히자마자 삭제됩니다. 만약 *delete*가 True이고 *delete_on_close*가 False이면, 컨텍스트 관리자 종료 시에만 파일이 삭제되거나, :term:`파일형식 객체 <file-like object>`가 최종화될 때 삭제됩니다. 이 경우 삭제가 항상 보장되는 것은 아닙니다 ( :meth:`object.__del__` 참조). *delete*가 False이면, *delete_on_close 값은 무시됩니다.
따라서 임시 파일의 이름을 사용하여 닫은 후에 파일을 다시 열려면, 파일 닫힘 시 삭제되지 않도록 delete 매개 변수를 False로 설정하거나, 임시 파일이
with문에서 생성된 경우 delete_on_close 매개 변수를 False로 설정해야 합니다. 후자의 접근 방식이 권장되는데, 이는 컨텍스트 관리자 종료 시 임시 파일의 자동 정리 기능을 제공하기 때문입니다.파일을 열어 두고 이름으로 다시 열 때는 다음과 같이 작동합니다:
POSIX에서는 파일을 항상 다시 열 수 있습니다.
Windows에서는 다음 조건들 중 최소한 하나가 충족되는지 확인하십시오:
delete 가 False입니다
추가 열기 공유 삭제 액세스 (예: 플래그
O_TEMPORARY를 가진os.open()을 호출하여)delete 는 True이지만 delete_on_close 는 False입니다. 이 경우, 삭제 액세스를 공유하지 않는 추가 열기(예: 내장된
open()으로 생성)는 컨텍스트 관리자를 벗어나기 전에 닫아야 합니다. 그렇지 않으면 컨텍스트 관리자 종료 시의os.unlink()호출이PermissionError로 실패합니다.
Windows에서는 delete_on_close 가 False이고, 파일이 사용자가 삭제 액세스를 갖지 못하는 디렉터리에서 생성된 경우, 컨텍스트 관리자 종료 시의
os.unlink()호출은PermissionError로 실패합니다. delete_on_close 가 True인 경우에는 이러한 일이 발생할 수 없습니다. 이는 열기 시 요청된 액세스가 허용되지 않으면 즉시 실패하기 때문에 삭제 액세스가 open에 의해 요청되기 때문입니다.POSIX(에만)에서는 SIGKILL로 갑작스럽게 종료된 프로세스는 생성했던 NamedTemporaryFiles를 자동으로 삭제할 수 없습니다.
인자
fullpath로 감사 이벤트tempfile.mkstemp를 발생시킵니다.버전 3.8에서 변경: errors 매개 변수를 추가했습니다.
버전 3.12에서 변경: delete_on_close 매개 변수를 추가했습니다.
- 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`와 :class:`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`에 대한 :const:`os.O_EXCL()플래그를 올바르게 구현한다고 가정할 때, 파일 생성에 경쟁 조건은 없습니다. 파일은 생성한 사용자 ID만 읽고 쓸 수 있습니다. 플랫폼이 권한 비트를 사용하여 파일이 실행 가능한지 여부를 나타낸다면, 그 파일은 아무도 실행할 수 없습니다.파일 기술자는 :ref:`자식 프로세스에 의해 상속되지 않는다 <fd_inheritance>`입니다.
TemporaryFile()과 달리,mkstemp()의 사용자는 임시 파일로의 작업을 끝내면 파일을 삭제해야 합니다.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`이 아닌 한 유형에 관계없이 모든 :data:`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