Saya memiliki formulir web python dengan dua opsi - Unggah file dan textarea . Saya perlu mengambil nilai dari masing-masing dan meneruskannya ke program baris perintah lain. Saya dapat dengan mudah mengirimkan nama file dengan opsi unggah file, tetapi saya tidak yakin bagaimana cara melewatkan nilai textarea.
Saya pikir yang perlu saya lakukan adalah:
- Buat nama file yang unik
- Buat file sementara dengan nama itu di direktori kerja
- Simpan nilai yang diteruskan dari textarea ke file sementara
- Jalankan program baris perintah dari dalam modul python saya dan berikan nama file sementara
Saya tidak yakin bagaimana cara menghasilkan nama file yang unik. Adakah yang bisa memberi saya beberapa tip tentang cara menghasilkan nama file yang unik? Algoritme, saran, dan baris kode apa pun dihargai.
Terima kasih atas perhatianmu
Jawaban:
Saya tidak berpikir pertanyaan Anda sangat jelas, tetapi jika yang Anda butuhkan hanyalah nama file yang unik ...
import uuid unique_filename = str(uuid.uuid4())
sumber
uuid.uuid4().hex
akan menjadi pilihan yang lebih baik, lihat detailnya di sini .Jika Anda ingin membuat file sementara dengan Python, ada modul bernama tempfile di pustaka standar Python. Jika Anda ingin meluncurkan program lain untuk mengoperasikan file, gunakan tempfile.mkstemp () untuk membuat file, dan os.fdopen () untuk mengakses deskriptor file yang diberikan mkstemp () kepada Anda.
Kebetulan, Anda mengatakan Anda menjalankan perintah dari program Python? Anda hampir pasti harus menggunakan modul subprocess .
Jadi Anda dapat dengan senang hati menulis kode yang terlihat seperti:
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)
Dengan menjalankan itu, Anda akan menemukan bahwa
cat
perintah tersebut bekerja dengan baik, tetapi file sementara telah dihapus difinally
blok tersebut. Sadarilah bahwa Anda harus menghapus file sementara yang mkstemp () kembalikan sendiri - perpustakaan tidak memiliki cara untuk mengetahui kapan Anda selesai dengan itu!(Sunting: Saya telah berasumsi bahwa NamedT TemporaryFile melakukan apa yang Anda cari, tetapi itu mungkin tidak begitu nyaman - file akan segera dihapus ketika objek file temp ditutup, dan memiliki proses lain membuka file sebelum Anda menutupnya tidak akan berfungsi pada beberapa platform, terutama Windows. Maaf, saya gagal.)
sumber
The
uuid
modul akan menjadi pilihan yang baik, saya lebih suka menggunakanuuid.uuid4().hex
sebagai nama file acak karena akan kembali sebuah string hex tanpa strip .import uuid filename = uuid.uuid4().hex
Outputnya akan seperti ini:
>>> import uuid >>> uuid.uuid() UUID('20818854-3564-415c-9edc-9262fbb54c82') >>> str(uuid.uuid4()) 'f705a69a-8e98-442b-bd2e-9de010132dc4' >>> uuid.uuid4().hex '5ad02dfb08a04d889e3aa9545985e304' # <-- this one
sumber
Mungkin Anda membutuhkan file sementara yang unik?
import tempfile f = tempfile.NamedTemporaryFile(mode='w+b', delete=False) print f.name f.close()
f membuka file.
delete=False
Berarti jangan hapus file setelah ditutup.Jika Anda membutuhkan kontrol atas nama file, ada opsional
prefix=...
dansuffix=...
argumen yang mengambil string. Lihat https://docs.python.org/3/library/tempfile.html .sumber
w+b
adalah defaultnyamode
. Menggunakantempfile
fungsionalitas apa pun memiliki kerugian berupa izin akses file yang salah:tempfile
dokumen digunakanos.O_TMPFILE
sebagai masker, tetapi pembuatan file normal menghormatios.umask()
.Anda dapat menggunakan modul datetime
import datetime uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')
Perhatikan bahwa: Saya menggunakan
replace
karena titik dua tidak diperbolehkan dalam nama file di banyak sistem operasi.Itu saja, ini akan memberi Anda nama file unik setiap saat.
sumber
Saya menemukan pertanyaan ini, dan saya akan menambahkan solusi saya untuk mereka yang mungkin mencari sesuatu yang serupa. Pendekatan saya hanya membuat nama file acak dari
ascii
karakter. Ini akan menjadi unik dengan probabilitas yang baik.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)
sumber
path.exists()
pengembalianFalse
dan waktu konsumen benar-benar membuka file.Ini bisa dilakukan dengan menggunakan fungsi unik di modul ufp.path .
import ufp.path ufp.path.unique('./test.ext')
jika jalur saat ini ada file 'test.ext'. ufp.path.unique function return './test (d1) .ext'.
sumber
Untuk membuat jalur file unik jika ada, gunakan paket acak untuk membuat nama string baru untuk file. Anda dapat merujuk kode di bawah ini untuk hal yang sama.
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
Sekarang Anda dapat menggunakan jalur ini untuk membuat file yang sesuai.
sumber
Jika Anda memerlukan ID unik pendek sebagai nama file Anda, coba
shortuuid
, shortuuid menggunakan huruf kecil dan besar serta angka, dan hapus karakter yang tampak serupa seperti l, 1, I, O dan 0.>>> import shortuuid >>> shortuuid.uuid() 'Tw8VgM47kSS5iX2m8NExNa' >>> len(ui) 22
dibandingkan dengan
>>> import uuid >>> unique_filename = str(uuid.uuid4()) >>> len(unique_filename) 36 >>> unique_filename '2d303ad1-79a1-4c1a-81f3-beea761b5fdf'
sumber