Python에서 임의의 파일 이름을 생성하는 가장 좋은 방법


95

파이썬에서 내가 서버에 저장하는 파일 (이름) 앞에 추가 할 임의의 텍스트를 생성하는 가장 좋은 방법 또는 가장 좋은 방법은 덮어 쓰지 않도록합니다. 감사합니다!

답변:


109

Python에는 임시 파일 이름을 생성하는 기능이 있습니다 . http://docs.python.org/library/tempfile.html을 참조 하십시오 . 예를 들면 :

In [4]: import tempfile

를 호출 할 tempfile.NamedTemporaryFile()때마다 다른 임시 파일이 생성되며 해당 이름은 .name속성을 사용하여 액세스 할 수 있습니다 . 예 :

In [5]: tf = tempfile.NamedTemporaryFile()
In [6]: tf.name
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i'

In [7]: tf = tempfile.NamedTemporaryFile()
In [8]: tf.name
Out[8]: 'c:\\blabla\\locals~1\\temp\\tmpr8vvme'

고유 한 파일 이름이 있으면 일반 파일처럼 사용할 수 있습니다. 참고 : 기본적으로 파일 은 닫히면 삭제 됩니다. 그러나 delete매개 변수가 False이면 파일이 자동으로 삭제되지 않습니다.

전체 매개 변수 세트 :

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

임시 파일의 접두사를 지정할 수도 있습니다 (파일 생성 중에 제공 할 수있는 다양한 매개 변수 중 하나로) :

In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'

임시 파일 작업에 대한 추가 예제는 여기 에서 찾을 수 있습니다.


1
다음에 컴퓨터를 다시 시작할 때 해당 파일이 삭제됩니까?
하여 HelloWorld

15
이 솔루션의 문제점은 파일 이름뿐만 아니라 이미 열려있는 파일도 생성한다는 것입니다. 아직 존재하지 않는 새 파일에 대한 임시 파일 이름이 필요한 경우 (예 : os 명령의 출력으로 사용하기 위해) 그렇지 않습니다. 이 경우 str (uuid.uuid4 ())와 같은 작업을 수행 할 수 있습니다.
Luca

@Luca 유용하고 향후 참조를 위해 언급 된 추가 의견에 감사드립니다. 그러나 OP는 파일을 저장하고 싶기 때문에 파일을 열어야한다고 분명히 밝혔으므로이 솔루션은이를 제공합니다.
Levon

때에 따라 다르지. 적절한 서버 호출을 구성하려면 이름이 필요할 수 있습니다. 확실하지 않다. 어쨌든 귀하의 답변은 확실히 더 일반적인 경우입니다.
Luca

104

임의의 문자열을 생성하기 위해 UUID 모듈 을 사용할 수 있습니다 .

import uuid
filename = str(uuid.uuid4())

UUID 생성기가 중복 식별자 (이 경우 파일 이름)를 생성 할 가능성이 극히 낮 으므로 유효한 선택입니다 .

향후 100 년 동안 매초 10 억 UUID를 생성 한 후에야 하나의 복제본 만 생성 할 확률은 약 50 %가됩니다. 지구상의 모든 사람이 6 억 UUID를 소유하고 있다면 하나의 중복 가능성은 약 50 %가 될 것입니다.


16
고유 한 파일 이름을 원하지만 아직 생성하지 않으려는 경우에도 매우 유용합니다.
Prof. Falken 2013 년

14
또는 uuid.uuid4().hex대시 ( -) 없이 16 진 문자열을 가져 오는 데 사용 합니다 .
Rockallite 2015

17

일반적인 접근 방식은 파일과 시간적 관계를 갖도록 파일 이름에 접두사 / 접미사로 타임 스탬프를 추가하는 것입니다. 더 많은 고유성이 필요하면 여기에 임의의 문자열을 추가 할 수 있습니다.

import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'

4
다중 스레드 환경에서는 시퀀스와 관련된 경쟁 조건이 1. Test if file exists, 2. create file.있을 수 있습니다. 다른 프로세스가 1 단계와 2 단계 사이에 사용자의 작업을 중단하고 파일을 생성하면 코드가 재개 될 때 다른 프로세스의 파일을 덮어 씁니다.
Li-aung Yip

@ Li-aungYip 또한 6-8 개의 임의 문자 시퀀스를 사용할 수도 있습니다 (동일한 초에 2 개의 파일이 생성되는 경우).
bobobobo 2013

@bobobobo : 또는 tempfile이를 처리 하는 모듈을 사용할 수 있습니다. :)
Li-aung Yip

나는 마이크로 초를 추가하는 것이 좋습니다. 즉...strftime("%y%m%d_%H%M%S%f")
AstraSerg

8

임의의 파일 이름 을 생성하도록 요청 된 OP 아닌 임의의 파일 . 시간과 UUID가 충돌 할 수 있습니다. 단일 시스템 (공유 파일 시스템이 아님)에서 작업하고 프로세스 / 스레드가 자체적으로 작동하지 않는 경우 os.getpid ()를 사용하여 고유 한 PID를 얻고이를 고유 한 파일 이름의 요소로 사용하십시오. 다른 프로세스는 분명히 동일한 PID를 얻지 못할 것입니다. 다중 스레드 인 경우 스레드 ID를 가져옵니다. 단일 스레드 또는 프로세스가 여러 다른 임시 파일을 생성 할 수있는 코드의 다른 측면이있는 경우 다른 기술을 사용해야 할 수 있습니다. 롤링 인덱스가 작동 할 수 있습니다 (오래 유지하지 않거나 롤오버에 대해 걱정할 수있는 파일을 너무 많이 사용하지 않는 경우). 이 경우 전역 해시 / 인덱스를 "활성"파일로 유지하는 것으로 충분합니다.

장황한 설명에 대해 죄송하지만 정확한 사용법에 따라 다릅니다.


8

파일 경로가 필요하지 않고 길이가 미리 정의 된 임의의 문자열 만 필요하면 다음과 같이 사용할 수 있습니다.

>>> import random
>>> import string

>>> file_name = ''.join(random.choice(string.ascii_lowercase) for i in range(16))
>>> file_name
'ytrvmyhkaxlfaugx'

7

원래 파일 이름을 새 파일 이름의 일부로 유지하려면 현재 시간의 MD5 해시를 사용하여 균일 한 길이의 고유 한 접두사를 생성 할 수 있습니다.

from hashlib import md5
from time import localtime

def add_prefix(filename):
    prefix = md5(str(localtime()).encode('utf-8')).hexdigest()
    return f"{prefix}_{filename}"

add_prefix ( 'style.css')를 호출하면 다음과 같은 시퀀스가 ​​생성됩니다.

a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css

1
피하려면 : 해싱하기 전에 유니 코드 객체를 인코딩해야합니다. md5 (str (localtime ()). encode ( 'utf-8')). hexdigest ()
PhoebeB

1
모든 종류의 데이터 (타임 스탬프 포함)의 해시는 자체적으로 고유성을 보장하지 않습니다 (무작위로 선택한 바이트 시퀀스가 ​​수행하는 것 이상).
Peter O.

1

여기에 내 2 센트를 추가합니다.

In [19]: tempfile.mkstemp('.png', 'bingo', '/tmp')[1]
Out[19]: '/tmp/bingoy6s3_k.png'

tempfile.mkstemp에 대한 파이썬 문서에 따르면 가능한 가장 안전한 방식으로 임시 파일을 생성합니다. 이 호출 후에 파일이 존재합니다.

In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
Out[20]: True

1

나는 개인적으로 내 텍스트를 무작위 / 고유 할뿐만 아니라 아름답게하는 것을 선호하기 때문에 정수에서 멋지게 보이는 무작위 텍스트를 생성하는 hashids lib를 좋아합니다. 통해 설치할 수 있습니다

pip install hashids

단편:

import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq

간단한 설명:

Hashids는 숫자에서 짧고 고유 한 비 순차적 ID를 생성하는 작은 오픈 소스 라이브러리입니다.


0
>>> import random
>>> import string    
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'

'string.ascii_letters'를 다른 텍스트 (예 : 모바일 NO, ID ...)를 생성 할 때 원하는 문자열 형식으로 변경할 수 있습니다. 여기에 이미지 설명 입력


0
import uuid
   imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())

1
이 코드가 문제를 해결할 수 있지만 문제를 해결하는 방법과 이유에 대한 설명포함 하여 게시물의 품질을 향상시키는 데 실제로 도움이되며 아마도 더 많은 찬성 투표를 받게됩니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Богдан Опир

-1

무작위 패키지를 사용할 수 있습니다.

import random
file = random.random()

파일 = STR (random.random ())
anajem

이것은 임의의 텍스트가 아닌 임의의 숫자를 생성합니다.
user1767754
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.