Mam formularz internetowy w języku Python z dwiema opcjami - przesyłanie plików i obszar tekstowy . Muszę pobrać wartości z każdego z nich i przekazać je do innego programu wiersza poleceń. Mogę łatwo przekazać nazwę pliku z opcjami przesyłania pliku, ale nie jestem pewien, jak przekazać wartość pola tekstowego.
Myślę, że muszę:
- Wygeneruj unikalną nazwę pliku
- Utwórz plik tymczasowy o tej nazwie w katalogu roboczym
- Zapisz wartości przekazane z textarea do pliku tymczasowego
- Uruchom program wiersza poleceń z wnętrza mojego modułu Pythona i przekaż mu nazwę pliku tymczasowego
Nie wiem, jak wygenerować unikalną nazwę pliku. Czy ktoś może mi dać kilka wskazówek, jak wygenerować unikalną nazwę pliku? Wszelkie algorytmy, sugestie i wiersze kodu są mile widziane.
Dzięki za troskę
Odpowiedzi:
Nie sądziłem, że twoje pytanie było bardzo jasne, ale jeśli potrzebujesz tylko unikalnej nazwy pliku ...
import uuid unique_filename = str(uuid.uuid4())
źródło
uuid.uuid4().hex
byłby lepszym wyborem, zobacz szczegóły tutaj .Jeśli chcesz tworzyć pliki tymczasowe w Pythonie, w standardowych bibliotekach Pythona znajduje się moduł o nazwie tempfile . Jeśli chcesz uruchomić inne programy do obsługi pliku, użyj tempfile.mkstemp (), aby utworzyć pliki i os.fdopen (), aby uzyskać dostęp do deskryptorów plików, które daje mkstemp ().
Nawiasem mówiąc, mówisz, że uruchamiasz polecenia z programu w języku Python? Prawie na pewno powinieneś używać modułu podprocesu .
Możesz więc całkiem wesoło napisać kod, który wygląda następująco:
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)
Po uruchomieniu tego
cat
polecenia powinieneś stwierdzić, że polecenie działało doskonale, ale plik tymczasowy został usunięty zfinally
bloku. Należy pamiętać, że mają usunąć plik tymczasowy że mkstemp () zwraca się - biblioteka nie ma możliwości dowiedzenia się, kiedy jesteś z nim zrobić!(Edycja: przypuszczałem, że NamedTemporaryFile zrobił dokładnie to, czego szukasz, ale może to nie być tak wygodne - plik zostanie usunięty natychmiast po zamknięciu obiektu pliku tymczasowego, a inne procesy otworzą plik przed jego zamknięciem nie będzie działać na niektórych platformach, zwłaszcza w systemie Windows. Przepraszamy, nie powiodło się z mojej strony).
źródło
uuid
Moduł byłby to dobry wybór, wolę używaćuuid.uuid4().hex
jako przypadkowej nazwy pliku, ponieważ będzie to powrót ciąg szesnastkowy bez kresek .import uuid filename = uuid.uuid4().hex
Wyniki powinny wyglądać następująco:
>>> import uuid >>> uuid.uuid() UUID('20818854-3564-415c-9edc-9262fbb54c82') >>> str(uuid.uuid4()) 'f705a69a-8e98-442b-bd2e-9de010132dc4' >>> uuid.uuid4().hex '5ad02dfb08a04d889e3aa9545985e304' # <-- this one
źródło
Może potrzebujesz unikalnego pliku tymczasowego?
import tempfile f = tempfile.NamedTemporaryFile(mode='w+b', delete=False) print f.name f.close()
f jest plikiem otwartym.
delete=False
oznacza, że nie usuwaj pliku po zamknięciu.Jeśli potrzebujesz kontroli nad nazwą pliku, istnieją argumenty opcjonalne
prefix=...
isuffix=...
przyjmujące ciągi. Zobacz https://docs.python.org/3/library/tempfile.html .źródło
w+b
jest wartością domyślnąmode
.tempfile
Wadą korzystania z dowolnej funkcji są niepoprawne uprawnienia dostępu do plików:tempfile
dokumenty używaneos.O_TMPFILE
jako maska, ale normalne tworzenie plików jest zgodneos.umask()
.Możesz użyć modułu datetime
import datetime uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')
Zauważ, że: używam,
replace
ponieważ dwukropki nie są dozwolone w nazwach plików w wielu systemach operacyjnych.To wszystko, za każdym razem otrzymasz unikalną nazwę pliku.
źródło
Trafiłem na to pytanie i dodam moje rozwiązanie dla tych, którzy mogą szukać czegoś podobnego. Moje podejście polegało na utworzeniu losowej nazwy pliku ze
ascii
znaków. Będzie wyjątkowy z dużym prawdopodobieństwem.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)
źródło
path.exists()
powrotuFalse
a faktycznym otwarciem pliku przez konsumenta istnieje sytuacja wyścigu .Można to zrobić za pomocą unikalnej funkcji w module ufp.path .
import ufp.path ufp.path.unique('./test.ext')
jeśli istnieje bieżąca ścieżka, plik „test.ext”. ufp.path.unique function return './test (d1) .ext'.
źródło
Aby utworzyć unikalną ścieżkę do pliku, jeśli istnieje, użyj pakietu losowego, aby wygenerować nową nazwę ciągu dla pliku. Możesz odnieść się do poniższego kodu dla tego samego.
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
Teraz możesz użyć tej ścieżki do odpowiedniego utworzenia pliku.
źródło
Jeśli potrzebujesz krótkich, unikalnych identyfikatorów jako nazwy pliku, spróbuj
shortuuid
, shortuuid używa małych i wielkich liter oraz cyfr i usuwa podobnie wyglądające znaki, takie jak l, 1, I, O i 0.>>> import shortuuid >>> shortuuid.uuid() 'Tw8VgM47kSS5iX2m8NExNa' >>> len(ui) 22
w porównaniu do
>>> import uuid >>> unique_filename = str(uuid.uuid4()) >>> len(unique_filename) 36 >>> unique_filename '2d303ad1-79a1-4c1a-81f3-beea761b5fdf'
źródło