# `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 이상이 필요합니다).

  On platforms that are neither Posix nor Cygwin, TemporaryFile is an alias for 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)

  This function operates exactly as `TemporaryFile()` does, except that the file is guaranteed to have a visible name in the file system (on Unix, the directory entry is not unlinked). That name can be retrieved from the `name` attribute of the returned file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows). If delete is true (the default), the file is deleted as soon as it is closed. The returned object is always a file-like object whose `file` attribute is the underlying true file object. This file-like object can be used in a `with` statement, just like a normal file.

  인자 `fullpath`로 감사 이벤트 `tempfile.mkstemp`를 발생시킵니다.

  버전 3.8에서 변경: errors 매개 변수를 추가했습니다.

`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()`가 있으며, 파일 크기와 관계없이 파일을 디스크 상의 파일로 롤오버(roll over) 합니다.

  반환된 객체는 파일류 객체인데, `rollover()`가 호출되었는지에 따라 `_file` 어트리뷰트는 `io.BytesIO`나 `io.TextIOWrapper` 객체(바이너리나 텍스트 mode가 지정되었는지에 따라)이거나 실제 파일 객체입니다. 이 파일류 객체는 일반 파일과 마찬가지로 `with` 문에서 사용할 수 있습니다.

  버전 3.3에서 변경: truncate 메서드는 이제 `size` 인자를 허용합니다.

  버전 3.8에서 변경: errors 매개 변수를 추가했습니다.

`tempfile.``TemporaryDirectory`(suffix=None, prefix=None, dir=None)

  이 함수는 `mkdtemp()`와 같은 규칙을 사용하여 임시 디렉터리를 안전하게 만듭니다. 결과 객체는 컨텍스트 관리자로 사용할 수 있습니다 (예를 참조하십시오). 컨텍스트가 완료되거나 임시 디렉터리 객체가 파괴되면 새로 만들어진 임시 디렉터리와 모든 내용이 파일 시스템에서 제거됩니다.

  반환된 객체의 `name` 어트리뷰트에서 디렉터리 이름을 꺼낼 수 있습니다. 반환된 객체가 컨텍스트 관리자로 사용될 때, `name`은 `with` 문의 `as` 절의 대상에 (있다면) 대입됩니다.

  `cleanup()` 메서드를 호출하여 디렉터리를 명시적으로 정리할 수 있습니다.

  인자 `fullpath`로 감사 이벤트 `tempfile.mkdtemp`를 발생시킵니다.

  버전 3.2에 추가.

`tempfile.``mkstemp`(suffix=None, prefix=None, dir=None, text=False)

  가장 안전한 방식으로 임시 파일을 만듭니다. 플랫폼이 `os.open()`에서 `os.O_EXCL` 플래그를 올바르게 구현한다고 가정할 때, 파일 생성에 경쟁 조건이 없습니다. 파일은 만드는 사용자 ID만 읽고 쓸 수 있습니다. 플랫폼이 권한 비트를 사용하여 파일이 실행 가능한지를 나타내면, 파일은 아무도 실행할 수 없습니다. 파일 기술자는 자식 프로세스에 의해 상속되지 않습니다.

  `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 매개 변수는 이제 경로류 객체를 받아들입니다.

`tempfile.``gettempdir`()

  임시 파일에 사용된 디렉터리 이름을 반환합니다. 이것은 이 모듈의 모든 함수에 대한 dir 인자의 기본값을 정의합니다.

  파이썬은 표준 디렉터리 목록을 검색하여 호출하는 사용자가 파일을 만들 수 있는 디렉터리를 찾습니다. 목록은 다음과 같습니다:

  1. `TMPDIR` 환경 변수로 명명된 디렉터리.

  2. `TEMP` 환경 변수로 명명된 디렉터리.

  3. `TMP` 환경 변수로 명명된 디렉터리.

  4. 플랫폼별 위치:

     - 윈도우에서, 디렉터리 `C:\TEMP`, `C:\TMP`, `\TEMP` 및 `\TMP`, 이 순서대로.

     - 다른 모든 플랫폼에서, 디렉터리 `/tmp`, `/var/tmp` 및 `/usr/tmp`, 이 순서대로.

  5. 최후의 수단으로, 현재 작업 디렉터리.

  이 검색 결과는 캐시 됩니다, 아래 `tempdir` 설명을 참조하십시오.

`tempfile.``gettempdirb`()

  `gettempdir()`과 같지만, 반환 값이 바이트열입니다.

  버전 3.5에 추가.

`tempfile.``gettempprefix`()

  임시 파일을 만드는 데 사용된 파일명 접두사를 반환합니다. 디렉터리 구성 요소가 포함되어 있지 않습니다.

`tempfile.``gettempprefixb`()

  `gettempprefix()`와 같지만, 반환 값이 바이트열입니다.

  버전 3.5에 추가.

모듈은 전역 변수를 사용하여 `gettempdir()`이 반환한 임시 파일에 사용되는 디렉터리의 이름을 저장합니다. 선택 절차를 무시하도록 직접 설정할 수 있지만, 권장하지 않습니다. 이 모듈의 모든 함수는 디렉터리를 지정하는 데 사용할 수 있는 dir 인자를 사용하며 이는 권장되는 방법입니다.

`tempfile.``tempdir`

  `None` 이외의 값으로 설정되면, 이 변수는 이 모듈에 정의된 함수의 dir 인자의 기본값을 정의합니다.

  `gettempprefix()`를 제외한 위의 함수를 호출할 때 `tempdir`이 `None`(기본값)이면 `gettempdir()`에 설명된 알고리즘에 따라 초기화됩니다.

## 예

다음은 `tempfile` 모듈의 일반적인 사용법에 대한 몇 가지 예입니다:

    >>> import tempfile

    # create a temporary file and write some data to it
    >>> fp = tempfile.TemporaryFile()
    >>> fp.write(b'Hello world!')
    # read data from file
    >>> fp.seek(0)
    >>> fp.read()
    b'Hello world!'
    # close the file, it will be removed
    >>> fp.close()

    # create a temporary file using a context manager
    >>> with tempfile.TemporaryFile() as fp:
    ...     fp.write(b'Hello world!')
    ...     fp.seek(0)
    ...     fp.read()
    b'Hello world!'
    >>>
    # file is now closed and removed

    # create a temporary directory using the context manager
    >>> with tempfile.TemporaryDirectory() as tmpdirname:
    ...     print('created temporary directory', tmpdirname)
    >>>
    # directory and contents have been removed

## 폐지된 함수와 변수

임시 파일을 만드는 역사적인 방법은 먼저 `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