Python에서 임시 파일 만들기

Jay Shaw 2023년10월10일
  1. tempfile 모듈을 사용하여 Python에서 임시 파일 생성
  2. Python에서 명명된 임시 파일 만들기
  3. mkstemp 기능을 사용하여 Python에서 임시 파일 만들기
  4. Python에서 임시 디렉토리 생성
Python에서 임시 파일 만들기

이 문서에서는 Python에서 임시 파일 및 디렉터리를 만드는 방법을 설명합니다. Python의 임시 파일은 tempfile 모듈을 사용하여 생성됩니다.

이 기사에서는 TemporaryFile, NamedTemporaryFile, mkstempTemporaryDirectorytempfile의 네 가지 하위 기능에 대해서도 설명합니다.

tempfile 모듈을 사용하여 Python에서 임시 파일 생성

이 함수는 Python에서 안전하게 생성된 임시 파일을 생성하고 임시로 사용할 수 있는 파일과 유사한 저장 영역을 반환합니다. 닫히는 즉시 소멸됩니다(객체가 가비지 수집될 때 암시적 닫기 포함).

이 함수를 사용하여 Python에서 임시 파일을 만드는 구문은 다음과 같습니다.

file = tempfile.TemporaryFile()
# 	OR
file = tempfile.TemporaryFile(
    mode="w+b",  # Remains as Default mode if not mentioned
    suffix=None,  # adds a suffix to file name
    prefix=None,  # adds prefix to file name
    # etc.
)

Python의 이 임시 파일은 컨텍스트 완료(with 블록) 또는 파일 개체 파괴 file.close() 시 파일 시스템에서 삭제됩니다. 모드 매개변수의 기본값이 w+b이기 때문에 새 파일을 닫지 않고 읽고 쓸 수 있습니다.

저장된 데이터에 관계없이 모든 시스템에서 일관성을 유지하기 위해 바이너리 모드로 작동합니다. 버퍼링, 인코딩, 오류 및 줄 바꿈과 같은 일부 추가 용어는 매개 변수 내에서 사용할 수 있는 파이썬 내장 함수 open()의 일부입니다.

아래 프로그램은 TemporaryFile()을 사용하여 Python에서 임시 파일을 만드는 방법을 보여줍니다.

코드의 첫 번째 줄은 라이브러리 패키지 tmpfile을 가져옵니다. tempfile.TemporaryFile() 함수를 사용하여 임시 파일을 생성하는 filepath 변수가 생성됩니다.

데이터는 filepath.write() 기능을 사용하여 임시 파일 내부에 기록됩니다. 이 매개변수는 바이트 유형 값만 사용하므로 리터럴 b가 문자열 앞에 추가됩니다.

filepath.seek(0) 함수는 길이 0부터 시작하는 파일 스트림의 파일을 로드합니다.

인쇄 변수 filepath는 개체의 주소를 보여줍니다. 임시 파일의 파일 이름을 확인하기 위해 filepath.name() 함수가 인쇄됩니다.

filepath.read() 함수는 임시 파일에서 데이터를 읽은 다음 인쇄합니다. 마지막으로 filepath.close()를 사용하여 임시 파일 개체를 해제합니다.

import tempfile

filepath = tempfile.TemporaryFile()

filepath.write(b"Writing some stuff")
filepath.seek(0)

print(filepath)
print(filepath.name)

print(filepath.read())
filepath.close()

출력:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x00000285D92DAC50>
C:\Users\WIN10~1\AppData\Local\Temp\st.cq3d03ezloraine
b'Hello world!'

Process finished with exit code 0

다른 프로그램을 살펴보자.

여기서 filepath 변수는 TemporaryFile 하위 기능의 세 가지 매개변수를 사용합니다. 모드는 읽기와 쓰기를 의미하는 w+b로 설정됩니다.

또한 접두사 st. 파일 이름에 접미사 loarine이 추가됩니다. 데이터가 임시로 기록되고 파일 이름이 인쇄됩니다.

import tempfile

filepath = tempfile.TemporaryFile(
    mode="w+b",
    prefix="st.",  # adds prefix to file name
    suffix="loraine",  # adds a suffix to file name
)

filepath.write(b"Hello world!")

print(filepath.name)

filepath.close()

파일 이름에 접두사와 접미사가 추가된 것을 볼 수 있습니다.

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
C:\Users\WIN10~1\AppData\Local\Temp\st.kepthvu_loraine

Process finished with exit code 0

프로그램 종료 시 임시 파일이 명시적으로 닫혀 있음을 알 수 있습니다. 이렇게 하면 파일이 닫히지만 삭제되지는 않습니다.

파일을 닫은 후에도 파일 이름을 표시할 수 있지만 내용을 로드할 수는 없습니다.

Python에서 닫힌 임시 파일을 읽거나 쓰면 일반 파일과 마찬가지로 값 오류가 발생합니다.

import tempfile

filepath = tempfile.TemporaryFile(
    mode="w+b",
    prefix="st.",  # adds prefix to file name
    suffix="loraine",  # adds a suffix to file name
)

filepath.write(b"Hello world!")

filepath.close()

print(filepath.name)

filepath.write(b"Hello world!")

출력:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
C:\Users\WIN10~1\AppData\Local\Temp\st.f7n0s5a6loraine
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 14, in <module>
    filepath.write(b'Hello world!')
  File "C:\Python36\lib\tempfile.py", line 485, in func_wrapper
    return func(*args, **kwargs)
ValueError: write to closed file

Process finished with exit code 1

Python에서 명명된 임시 파일 만들기

이 함수와 TemporaryFile()의 유일한 차이점은 파일이 파일 시스템에서 볼 수 있는 이름을 갖도록 보장한다는 것입니다. 이 이름은 객체가 반환될 때 name 속성에서 찾을 수 있습니다.

UNIX에서는 이전 파일이 이미 열려 있어도 같은 이름을 사용하여 다른 임시 파일을 열 수 있지만 Windows에서는 금지되어 있습니다.

기본적으로 Python의 임시 파일은 닫히는 즉시 제거되도록 설정되어 있지만 delete = False를 설정하여 끌 수 있습니다. 일반 파일과 유사하게 이 파일류 객체는 명령문에서 사용할 수 있습니다.

이 하위 기능을 사용하는 구문은 다음과 같습니다.

tmp = tempfile.NamedTemporaryFile()
# 	OR
tmp = tempfile.NamedTemporaryFile(mode="w+b", delete=False, suffix=None, prefix=None)

Python에서 이름이 지정된 임시 파일을 만들려면 아래 프로그램을 사용하십시오.

이 프로그램은 여기에서 ostempfile이라는 두 개의 라이브러리 패키지를 가져옵니다. 임시 파일은 tempo_file 변수를 사용하여 생성되고 delete 매개변수는 False로 설정되며 접두사와 접미사가 제공됩니다.

try 블록 내에서 print(tempo_file)를 사용하여 파일 개체가 인쇄됩니다. 그런 다음 print(tempo_file.name)을 사용하여 파일 이름을 인쇄합니다.

tempo_file.write() 함수는 이 임시 파일에 쓰는 데 사용됩니다.

finally 블록 내에서 파일은 tempo_file.close()를 사용하여 닫힙니다. 그런 다음 os.unlink() 함수를 사용하여 파일 이름이 파일 개체에서 연결 해제됩니다.

import os
import tempfile

tempo_file = tempfile.NamedTemporaryFile(delete=False, prefix="Ice", suffix="cream")
try:
    print(tempo_file)
    print(tempo_file.name)
    tempo_file.write(b"Peacock is national bird of India")
finally:
    tempo_file.close()
    os.unlink(tempo_file.name)

출력:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x000001DE90935C18>
C:\Users\WIN10~1\AppData\Local\Temp\Icez5eghui0cream

Process finished with exit code 0

위의 프로그램에서 delete 매개변수는 False로 바뀌었습니다. 즉, 암시적으로 닫히지 않으면 열린 상태로 유지됩니다. delete 매개변수가 True로 설정되면 파일이 닫힌 후 파일 이름에 액세스할 수 없습니다.

import os
import tempfile

tempo_file = tempfile.NamedTemporaryFile(delete=True)
try:
    print(tempo_file.name)
finally:
    tempo_file.close()
    os.unlink(tempo_file.name)

print(tempo_file.name)

출력:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/ain.py"
C:\Users\WIN10~1\AppData\Local\Temp\tmp6j3xxjzr
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 14, in <module>
    os.unlink(tempo_file.name)
FileNotFoundError: [WinError 2] The system cannot find the file specified:'C:\\Users\\WIN10~1\\AppData\\Local\\Temp\\tmp6j3xxjzr'

Process finished with exit code 1

with 블록은 파일을 자동으로 닫으므로 유용합니다.

import tempfile

with tempfile.TemporaryFile(delete=True) as tempo_file:
    print(tempo_file)
    print(tempo_file.name)
    tempo_file.write(b"Peacock is national bird of India")

print(tempo_file.read())

출력:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
<tempfile._TemporaryFileWrapper object at 0x0000027EB1C09390>
C:\Users\WIN10~1\AppData\Local\Temp\tmpzk_gpkau
Traceback (most recent call last):
  File "C:/Users/Win 10/main.py", line 11, in <module>
    print(tempo_file.read())
  File "C:\Python36\lib\tempfile.py", line 485, in func_wrapper
    return func(*args, **kwargs)
ValueError: read of closed file

Process finished with exit code 1

mkstemp 기능을 사용하여 Python에서 임시 파일 만들기

이 함수는 Python에서 임시 파일을 생성할 수 있는 최고 수준의 보안을 제공합니다. 파일을 생성한 사용자 ID만 파일을 읽고 쓸 수 있습니다.

플랫폼이 파일이 실행 가능한지 여부를 결정하기 위해 권한 비트를 사용하는 경우 아무도 파일을 실행할 수 없습니다. 자식 프로세스도 파일 설명자를 상속하지 않습니다.

mkstemp에 사용되는 구문은 다음과 같습니다.

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

TemporaryFile() 함수와 달리 mkstemp()가 사용될 때 프로그래머는 암시적으로 임시 파일을 삭제해야 합니다. 함수에는 prefix, suffixdir 매개변수에 대한 고유한 역할이 있습니다.

그들을 보자.

None으로 설정되지 않은 경우 파일 이름은 지정된 접미사로 끝납니다. 그렇지 않으면 하나도 없을 것입니다. mkstemp()는 파일 이름과 접미사 사이에 점을 넣지 않기 때문에 필요한 경우 접미사 시작 부분에 점을 넣어야 합니다.

파일 이름은 None 대신 접두사가 있는 경우 접두사로 시작합니다. 그렇지 않으면 기본 접두사가 사용됩니다. gettempprefix() 또는 gettempprefixb()에서 반환된 값은 어느 프로그램이 적절해 보이는지 기본값으로 사용됩니다.

dir은 임시 파일의 디렉토리를 저장합니다. dirNone으로 설정되지 않은 경우 지정된 디렉토리에 파일이 생성됩니다. 그렇지 않으면 기본 디렉토리가 사용됩니다.

기본 디렉토리는 플랫폼에 따라 다릅니다.

TMPDIR, TEMP 또는 TMP 환경 변수를 변경하여 애플리케이션 사용자는 해당 플랫폼별 목록에서 기본 디렉토리 선택을 재정의할 수 있습니다.

suffix, prefixdirNone으로 설정되지 않은 경우 모두 같은 유형이어야 합니다. 이것이 바이트이면 반환되는 이름은 str이 아닌 바이트입니다.

suffix=b를 전달하면 기본 동작 대신 반환 값에 바이트가 강제 적용됩니다.

텍스트가 지정되고 True인 경우 파일이 텍스트 모드로 열립니다. False로 설정하면 시스템은 기본적으로 바이너리 모드로 파일을 엽니다.

아래 프로그램은 mkstemp를 사용하여 임시 파일을 생성합니다. mkstemp 함수는 두 개의 인수를 사용합니다. 첫 번째는 파일의 식별자이고 두 번째는 파일 이름입니다.

try 블록 내에서 핸들을 통한 with 블록을 사용하여 파일을 엽니다. 그런 다음 일부 데이터가 파일 내부에 기록됩니다.

finally 블록 내에서 파일은 os.unlink(filename)을 사용하여 암시적으로 삭제됩니다.

import os
import tempfile

handle, filename = tempfile.mkstemp(suffix=".bat")
try:
    with os.fdopen(handle, "w") as f:
        f.write("signature")
        print(handle)
        print(filename)

finally:
    os.unlink(filename)

출력:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
3
C:\Users\WIN10~1\AppData\Local\Temp\tmp1yvy9j_c.bat

Process finished with exit code 0

Python에서 임시 디렉토리 생성

이 클래스는 임시 디렉토리를 안전하게 만듭니다. 이러한 개체는 with 블록과 같은 컨텍스트 관리자를 사용하여 사용할 수 있습니다.

새로 형성된 임시 디렉토리와 그 내용은 컨텍스트 완료 또는 임시 디렉토리 객체 파괴 시 메모리에서 삭제됩니다.

반환된 객체의 name 속성에는 얻을 수 있는 디렉토리 이름이 포함됩니다. 이 이름은 반환된 객체가 컨텍스트 관리자로 사용될 때 with 문(있는 경우)에서 as 절의 대상에 지정됩니다.

예를 들어:

with tempfile.TemporaryDirectory() as f:  # 'f' is the 'as' clause in this while statement
    print("Temporary directory is created", f)

cleanup() 메소드를 호출하면 디렉토리가 명시적으로 지워집니다. 명시적 또는 암시적 정리 중 처리되지 않은 예외는 정리 오류 무시가 true인 경우 무시됩니다.

남아 있는 제거 가능한 항목은 최선의 노력을 다해 파괴됩니다.

임시 디렉토리를 만들려면 아래 Python 프로그램을 사용할 수 있습니다.

import tempfile

with tempfile.TemporaryDirectory() as f:
    print("Temporary directory is created", f)

출력:

"C:\Users\Win 10\venv\Scripts\python.exe" "C:/Users/Win 10/main.py"
Temporary directory is created C:\Users\WIN10~1\AppData\Local\Temp\tmp1gk3c5z8

Process finished with exit code 0

이 기사에서는 Python의 tempfile 모듈과 그 하위 기능을 사용하여 임시 파일을 만드는 방법을 설명했습니다.

관련 문장 - Python File