[python] Python에서 실제 파일을 생성하지 않고 임시 파일 이름 생성

stackoverflow 의 질문 번호 10501247 은 Python에서 임시 파일을 만드는 방법에 대한 답변을 제공합니다.
제 경우에는 임시 파일 이름 만 있으면됩니다.
tempfile.NamedTemporaryFile ()을 호출하면 실제 파일 생성 후 파일 핸들이 반환됩니다.
파일 이름 만 얻을 수있는 방법이 있습니까?

# Trying to get temp file path
tf = tempfile.NamedTemporaryFile()
temp_file_name = tf.name
tf.close()
# Here is my real purpose to get the temp_file_name
f = gzip.open(temp_file_name ,'wb')
...



답변

임시 파일 이름을 원한다면 내부 임시 파일 함수를 호출 할 수 있습니다 _get_candidate_names().

import tempfile

temp_name = next(tempfile._get_candidate_names())
% e.g. px9cp65s

next다시 호출 하면 다른 이름 등이 반환됩니다. 이것은 임시 폴더의 경로를 제공하지 않습니다. 기본 ‘tmp’디렉토리를 얻으려면 다음을 사용하십시오.

defult_tmp_dir = tempfile._get_default_tempdir()
% results in: /tmp 


답변

이 작업을 수행하는 가장 쉽고 안전한 방법은 다음과 같습니다.

path = os.path.join(tempfile.mkdtemp(), 'something')

사용자 만 액세스 할 수있는 임시 디렉터리가 생성되므로 보안 문제는 없지만 파일이 생성되지 않으므로 해당 디렉터리에서 생성하려는 파일 이름을 선택할 수 있습니다.

편집 : Python 3에서 이제 tempfile.TemporaryDirectory()컨텍스트 관리자로 사용하여 삭제를 처리 할 수 ​​있습니다.

with tempfile.TemporaryDirectory() as tmp:
  path = os.path.join(tmp, 'something')
  # use path


답변

조금 늦었을지도 모르지만 문제가 있습니까?

import tempfile
with tempfile.NamedTemporaryFile(dir='/tmp', delete=False) as tmpfile:
    temp_file_name = tmpfile.name
f = gzip.open(temp_file_name ,'wb')


답변

tempfile.mktemp() 이 작업을 수행.

그러나 더 이상 사용되지 않습니다. 그러나 파일을 생성 하지 않으며_get_candidate_names() .

더 이상 사용되지 않는 이유는 이것을 호출하고 실제로 파일을 생성하려는 사이의 시간 차이 때문입니다. 그러나 제 경우에는 그 기회가 너무 희박하고 실패하더라도 그것은 받아 들일 것입니다. 그러나 사용 사례를 평가하는 것은 귀하에게 달려 있습니다.


답변

이전 답변을 결합하여 내 솔루션은 다음과 같습니다.

def get_tempfile_name(some_id):
    return os.path.join(tempfile.gettempdir(), next(tempfile._get_candidate_names()) + "_" + some_id)

확인 some_id당신을 위해 필요하지 않은 경우 선택.


답변

Joachim Isaksson이 주석에서 말했듯이, 이름 만 알면 다른 프로그램이 프로그램보다 먼저 해당 이름을 사용하면 문제가 발생할 수 있습니다. 가능성은 희박하지만 불가능하지는 않습니다.

따라서이 상황에서 안전한 방법은 서명이있는 전체 GzipFile () 생성자를 사용하는 것 GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])입니다. 따라서 원하는 경우 열린 fileobj와 파일 이름도 전달할 수 있습니다. 자세한 내용은 gzip 문서를 참조하십시오.


답변