개발/Python

[파이썬] 고유한 파일 이름을 만드는 방법은?

MinorMan 2022. 10. 24. 03:54
반응형

<질문>

두 가지 옵션이 있는 python 웹 양식이 있습니다.파일 업로드그리고텍스트 영역. 각각에서 값을 가져와 다른 명령줄 프로그램에 전달해야 합니다. 파일 업로드 옵션을 사용하여 파일 이름을 쉽게 전달할 수 있지만 텍스트 영역 값을 전달하는 방법을 모르겠습니다.

내가해야 할 일은 다음과 같습니다.

  1. 고유한 파일 이름 생성
  2. 작업 디렉토리에 해당 이름으로 임시 파일 생성
  3. 텍스트 영역에서 전달된 값을 임시 파일에 저장
  4. 내 파이썬 모듈 내부에서 명령줄 프로그램을 실행하고 임시 파일의 이름을 전달합니다.

고유한 파일 이름을 생성하는 방법을 모르겠습니다. 아무도 나에게 고유한 파일 이름을 생성하는 방법에 대한 몇 가지 팁을 줄 수 있습니까? 모든 알고리즘, 제안 및 코드 라인에 감사드립니다.

걱정 해주셔서 감사합니다


<답변1>

귀하의 질문이 매우 명확하다고 생각하지 않았지만 고유한 파일 이름만 있으면...

import uuid

unique_filename = str(uuid.uuid4())

<답변2>

Python에서 임시 파일을 만들고 싶다면 다음과 같은 모듈이 있습니다.tempfile파이썬의 표준 라이브러리에서. 파일에서 작동하도록 다른 프로그램을 시작하려면 tempfile.mkstemp()를 사용하여 파일을 만들고 os.fdopen()을 사용하여 mkstemp()가 제공하는 파일 설명자에 액세스하십시오.

덧붙여서, 파이썬 프로그램에서 명령을 실행하고 있다고 말씀하십니까? 당신은 거의 확실히 사용하고 있어야합니다subprocess기준 치수.

따라서 다음과 같은 코드를 아주 즐겁게 작성할 수 있습니다.

import subprocess
import tempfile
import os

(fd, filename) = tempfile.mkstemp()
try:
    tfile = os.fdopen(fd, "w")
    tfile.write("Hello, world!\n")
    tfile.close()
    subprocess.Popen(["/bin/cat", filename]).wait()        
finally:
    os.remove(filename)

실행하면cat명령이 완벽하게 작동했지만 임시 파일이finally차단하다. 당신이가지다mkstemp()가 자신을 반환하는 임시 파일을 삭제하려면 - 라이브러리는 언제 작업을 완료했는지 알 수 있는 방법이 없습니다!

(편집: 나는 NamedTemporaryFile이 당신이 하려는 일을 정확히 수행했다고 가정했지만 그렇게 편리하지 않을 수 있습니다. 임시 파일 개체가 닫힐 때 파일이 즉시 삭제되고 닫기 전에 다른 프로세스가 파일을 열도록 합니다. 일부 플랫폼, 특히 Windows에서는 작동하지 않습니다. 죄송합니다. 제 잘못입니다.)


<답변3>

그만큼uuid모듈은 좋은 선택이 될 것입니다.uuid.uuid4().hex반환하므로 임의의 파일 이름으로대시가 없는 16진수 문자열.

import uuid
filename = uuid.uuid4().hex

출력은 다음과 같아야 합니다.

>>> import uuid
>>> uuid.uuid()
UUID('20818854-3564-415c-9edc-9262fbb54c82')
>>> str(uuid.uuid4())
'f705a69a-8e98-442b-bd2e-9de010132dc4'
>>> uuid.uuid4().hex
'5ad02dfb08a04d889e3aa9545985e304'  # <-- this one

<답변4>

고유한 임시 파일이 필요합니까?

import tempfile

f = tempfile.NamedTemporaryFile(mode='w+b', delete=False)

print f.name
f.close()

f는 열린 파일입니다.delete=False닫은 후 파일을 삭제하지 않음을 의미합니다.

파일 이름을 제어해야 하는 경우 선택 사항이 있습니다.prefix=...그리고suffix=...문자열을 취하는 인수. 보다https://docs.python.org/3/library/tempfile.html.


<답변5>

당신은 사용할 수 있습니다datetime기준 치수

import datetime
uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')

참고 : 나는 사용하고 있습니다replace많은 운영 체제에서 파일 이름에 콜론이 허용되지 않기 때문입니다.

그게 다야, 이것은 매번 고유한 파일 이름을 제공할 것입니다.


<답변6>

파일 이름으로 짧은 고유 ID가 필요한 경우 다음을 시도하십시오.shortuuid,shortuuid소문자 및 대문자와 숫자를 사용하고 l, 1, I, O 및 0과 같이 유사하게 보이는 문자를 제거합니다.

>>> import shortuuid
>>> shortuuid.uuid()
'Tw8VgM47kSS5iX2m8NExNa'
>>> len(ui)
22

에 비해

>>> import uuid
>>> unique_filename = str(uuid.uuid4())
>>> len(unique_filename)
36
>>> unique_filename
'2d303ad1-79a1-4c1a-81f3-beea761b5fdf'

<답변7>

나는이 질문을 발견했으며 비슷한 것을 찾고있는 사람들을 위해 내 솔루션을 추가 할 것입니다. 내 접근 방식은 임의의 파일 이름을 만드는 것이 었습니다.ascii문자. 그것은 좋은 확률로 독특할 것입니다.

from random import sample
from string import digits, ascii_uppercase, ascii_lowercase
from tempfile import gettempdir
from os import path

def rand_fname(suffix, length=8):
    chars = ascii_lowercase + ascii_uppercase + digits

    fname = path.join(gettempdir(), 'tmp-'
                + ''.join(sample(chars, length)) + suffix)

    return fname if not path.exists(fname) \
                else rand_fname(suffix, length)

<답변8>

이것은 다음을 사용하여 수행할 수 있습니다.독특한기능ufp.path기준 치수.

import ufp.path
ufp.path.unique('./test.ext')

현재 경로가 존재하는 경우 'test.ext' 파일. ufp.path.unique 함수는 './test (d1).ext'를 반환합니다.


<답변9>

존재하는 경우 고유한 파일 경로를 생성하려면 임의 패키지를 사용하여 파일에 대한 새 문자열 이름을 생성합니다. 아래 코드를 참조할 수도 있습니다.

import os
import random
import string

def getUniquePath(folder, filename):    
    path = os.path.join(folder, filename)
    while os.path.exists(path):
         path = path.split('.')[0] + ''.join(random.choice(string.ascii_lowercase) for i in range(10)) + '.' + path.split('.')[1]
    return path

이제 이 경로를 사용하여 그에 따라 파일을 생성할 수 있습니다.

반응형