파일 업로드 와 텍스트 영역의 두 가지 옵션이있는 파이썬 웹 양식이 있습니다 . 각각의 값을 가져 와서 다른 명령 줄 프로그램에 전달해야합니다. 파일 업로드 옵션으로 파일 이름을 쉽게 전달할 수 있지만 텍스트 영역의 값을 전달하는 방법을 잘 모르겠습니다.
제가해야 할 일은 다음과 같습니다.
- 고유 한 파일 이름 생성
- 작업 디렉토리에 해당 이름으로 임시 파일을 만듭니다.
- 텍스트 영역에서 전달 된 값을 임시 파일에 저장
- 내 파이썬 모듈 내부에서 명령 줄 프로그램을 실행하고 임시 파일의 이름을 전달합니다.
고유 한 파일 이름을 생성하는 방법을 잘 모르겠습니다. 아무도 고유 파일 이름을 생성하는 방법에 대한 몇 가지 팁을 줄 수 있습니까? 모든 알고리즘, 제안 및 코드 줄에 감사드립니다.
여러분의 관심에 감사드립니다
답변
질문이 명확하지 않다고 생각했지만 고유 한 파일 이름 만 있으면됩니다.
import uuid
unique_filename = str(uuid.uuid4())
답변
Python에서 임시 파일을 만들고 싶다면 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에서는 작동하지 않습니다. 죄송합니다. 실패했습니다.)
답변
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
답변
고유 한 임시 파일이 필요한가요?
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을 참조 하십시오 .
답변
datetime 모듈을 사용할 수 있습니다.
import datetime
uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')
참고 : replace
많은 운영 체제에서 파일 이름에 콜론이 허용되지 않기 때문에 사용 하고 있습니다.
이것이 매번 고유 한 파일 이름을 제공합니다.
답변
나는이 질문을 보았고 비슷한 것을 찾고있는 사람들을 위해 해결책을 추가 할 것입니다. 내 접근 방식은 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)
답변
이것은 ufp.path 모듈 의 고유 기능을 사용하여 수행 할 수 있습니다 .
import ufp.path
ufp.path.unique('./test.ext')
현재 경로가 ‘test.ext’파일이있는 경우. ufp.path.unique 함수는 ‘./test (d1) .ext’를 반환합니다.