prosource

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

probook 2023. 7. 17. 21:12
반응형

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

Python에서 서버에 저장하는 파일(이름)에 추가할 임의 텍스트를 생성하는 가장 좋은 방법은 무엇입니까? 아니면 파일(이름)이 덮어쓰기되지 않도록 하는 것입니다.감사해요!

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

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

UUID 생성기가 중복된 식별자(이 경우 파일 이름)를 생성할 가능성이 매우 낮다는 점을 고려할 때 이는 유효한 선택입니다.

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

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'

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

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

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

OP에서 임의 파일이 아닌 임의 파일 이름을 생성하도록 요청했습니다.시간과 UUID가 충돌할 수 있습니다.공유 파일 시스템이 아닌 단일 컴퓨터에서 작업 중인 경우 프로세스/스레드가 자동으로 작동하지 않는 경우os.getpid()고유한 PID를 가져와 고유한 파일 이름의 요소로 사용합니다.다른 프로세스는 분명히 동일한 PID를 얻지 못할 것입니다.멀티 스레드인 경우 스레드 ID를 가져옵니다.코드의 다른 측면에서 단일 스레드 또는 프로세스가 여러 개의 다른 임시 파일을 생성할 수 있는 경우 다른 방법을 사용해야 할 수 있습니다.롤링 인덱스가 작동할 수 있습니다(오래 보관하지 않거나 너무 많은 파일을 사용하는 경우 롤오버가 걱정될 수 있습니다).이 경우 글로벌 해시/인덱스를 "활성" 파일로 유지하면 충분합니다.

장황하게 설명해서 죄송합니다만, 정확한 사용법에 따라 다릅니다.

파일 경로가 필요 없고 미리 정의된 길이의 임의 문자열만 필요한 경우 다음과 같은 것을 사용할 수 있습니다.

>>> import random
>>> import string

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

원래 파일 이름을 새 파일 이름의 일부로 유지하려면 현재 시간의 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

여기에 내 2센트를 더하면,

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

python doc for tempfile.mkstemp에 따르면 가장 안전한 방법으로 임시 파일을 만듭니다.이 호출 후 파일이 존재합니다.

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

날짜와 시간이 매초마다 변경되므로 데이터 시간을 uuid(Universally Unique Identifier)와 연결해야 합니다. 여기 답변에 대한 전체 코드가 있습니다.

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

저는 개인적으로 무작위/고유일할 뿐만 아니라 아름다운 텍스트를 선호하기 때문에 정수에서 보기 좋은 무작위 텍스트를 생성하는 hashids lib를 좋아합니다.다음을 통해 설치할 수 있습니다.

pip install hashids

스니펫:

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

간단한 설명:

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

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

다른 텍스트(예: 모바일 NO, ID...)를 생성할 때 'string.ascii_letters'를 원하는 문자열 형식으로 변경할 수 있습니다.enter image description here

import random

def Generate(): #function generates a random 6 digit number
    code = ''
    for i in range(6):
        code += str(random.randint(0,9))
    return code

print(Generate()+".txt")

해야 할 에는 다경우에임파합사니다야용해이름을 합니다.faker 확장자를 "" 생성됩니다.이렇게 하면 공통 확장자를 가진 "감지할 수 있는" 파일 이름이 생성됩니다.이 메서드는 시간이 지나면 이름 충돌이 발생할 수 있습니다. 시작하는 것 요.uuid아마 더 나을 겁니다

pip install faker

그리고나서,

from faker import Faker

fake = Faker()
for _ in range(10):
    print(fake.file_name())

링크:faker설명서: https://faker.readthedocs.io/en/master/index.html

저는 다음 솔루션에서 상당한 이점을 발견했습니다.

원격 서버의 디렉토리에 수십만 개의 이미지를 저장해야 했습니다.사용 중인 서버의 공간에 문제가 있었고 이러한 이미지 중 많은 수가 서로 중복되는 경우가 많았기 때문에 편리한 해결책은 이미지의 SHA를 사용하여 파일 이름을 생성하고 해당 이름을 사용하여 파일을 저장하는 것입니다.파일을 덮어쓰면 파일이 중복되므로 덮어쓸 수 있습니다.SHA256은 물리적으로 충돌이 발생할 수 없는 것으로 간주되므로 걱정 없이 영원히 사용할 수 있습니다.

import hashlib

image_path = '/tmp/my_image.png'
with open(image_path, 'rb') as f:
    image_bytes = f.read()

file_name = f'{hashlib.sha256(image_bytes).hexdigest()}.png'
with open(filename, 'wb') as ff:
    ff.write(image_bytes)

이 방법은 다음이 사용자의 상황에 적용되는 경우에만 유용합니다.

  1. 파일 작성 날짜는 중요하지 않습니다.
  2. 시스템이 작동하는 데 중복 파일이 필요하지 않습니다.
  3. 이미지 이름을 사용하여 이미지를 검색할 필요가 없습니다.

이 방법은 저장 중인 파일이 동일한 SHA를 생성하지 않을 경우에도 거의 도움이 되지 않지만 수천 개의 파일을 저장하고 중복 파일 외에 덮어쓰지 않도록 보장해야 하는 경우에도 유용할 수 있습니다.

왜 아무도 이것을 언급하지 않았는지는 모르겠지만, 시간을 마이크로초로 줄일 수 있습니다. 한 가지 해결책은 다음과 같습니다.

image_name = datetime.datetime.now().strftime('%Y_%m_%d_%H-%M-%S.%f')
image_name = image_name+".jpeg" #or whatever extension is needed

출력은 다음과 같습니다.

2023_03_21_11-08-08.734965.jpeg

이는 주문이 동일하기 때문에 시간 및/또는 날짜별로 파일을 주문할 수 있다는 장점이 있습니다.

랜덤 패키지를 사용할 수 있습니다.

import random
file = random.random()

언급URL : https://stackoverflow.com/questions/10501247/best-way-to-generate-random-file-names-in-python

반응형