Di Python, apa yang baik, atau cara terbaik untuk menghasilkan beberapa teks acak untuk ditambahkan ke file (nama) yang saya simpan ke server, hanya untuk memastikannya tidak menimpa. Terima kasih!
97
Python memiliki fasilitas untuk menghasilkan nama file sementara, lihat http://docs.python.org/library/tempfile.html . Misalnya:
In [4]: import tempfile
Setiap panggilan tempfile.NamedTemporaryFile()
menghasilkan file temp yang berbeda, dan namanya dapat diakses dengan .name
atribut, misalnya:
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'
Setelah Anda memiliki nama file yang unik, itu dapat digunakan seperti file biasa. Catatan : Secara default, file akan dihapus saat ditutup. Namun, jika delete
parameternya False, file tersebut tidak otomatis dihapus.
Set parameter lengkap:
tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
Anda juga dapat menentukan awalan untuk file sementara (sebagai salah satu dari berbagai parameter yang dapat diberikan selama pembuatan file):
In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'
Contoh tambahan untuk bekerja dengan file sementara dapat ditemukan di sini
Anda dapat menggunakan modul UUID untuk membuat string acak:
Ini adalah pilihan yang valid, mengingat generator UUID sangat tidak mungkin menghasilkan pengenal duplikat (dalam hal ini nama file):
sumber
uuid.uuid4().hex
untuk mendapatkan string hex tanpa tanda hubung (-
).pendekatan yang umum adalah menambahkan stempel waktu sebagai awalan / akhiran ke nama file agar memiliki beberapa hubungan temporal ke file. Jika Anda membutuhkan lebih banyak keunikan, Anda masih dapat menambahkan string acak ke dalamnya.
sumber
1. Test if file exists, 2. create file.
Jika proses lain mengganggu Anda antara langkah 1 dan 2, dan membuat file, ketika kode Anda dilanjutkan, itu akan menimpa file proses lainnya.tempfile
modul, yang menangani ini untuk Anda. :)...strftime("%y%m%d_%H%M%S%f")
OP meminta untuk membuat nama file acak, bukan file acak . Waktu dan UUID bisa bertabrakan. Jika Anda bekerja pada satu mesin (bukan sistem file bersama) dan proses / utas Anda tidak akan menginjak dirinya sendiri, gunakan os.getpid () untuk mendapatkan PID Anda sendiri dan gunakan ini sebagai elemen dari nama file unik. Proses lain jelas tidak akan mendapatkan PID yang sama. Jika Anda multithread, dapatkan id thread. Jika Anda memiliki aspek lain dari kode Anda di mana satu utas atau proses dapat menghasilkan beberapa file temporer yang berbeda, Anda mungkin perlu menggunakan teknik lain. Indeks bergulir dapat berfungsi (jika Anda tidak menyimpannya terlalu lama atau menggunakan begitu banyak file, Anda akan khawatir tentang rollover). Menjaga hash / indeks global ke file "aktif" akan cukup dalam kasus itu.
Mohon maaf atas penjelasan jangka panjangnya, tetapi itu tergantung pada penggunaan persis Anda.
sumber
Jika Anda tidak memerlukan jalur file, tetapi hanya string acak yang memiliki panjang yang telah ditentukan, Anda dapat menggunakan sesuatu seperti ini.
sumber
Jika Anda ingin mempertahankan nama file asli sebagai bagian dari nama file baru, awalan unik dengan panjang seragam dapat dibuat dengan menggunakan hash MD5 waktu saat ini:
Panggilan ke add_prefix ('style.css') menghasilkan urutan seperti:
sumber
Menambahkan dua sen saya di sini:
Menurut python doc untuk tempfile.mkstemp, ini membuat file sementara dengan cara yang paling aman. Harap dicatat bahwa file akan ada setelah panggilan ini:
sumber
Saya pribadi lebih suka teks saya tidak hanya acak / unik tetapi juga indah, itulah mengapa saya menyukai hashids lib, yang menghasilkan teks acak yang tampak bagus dari integer. Dapat diinstal melalui
pip install hashids
Potongan:
Deskripsi Singkat:
sumber
Anda dapat mengubah 'string.ascii_letters' ke format string apa pun yang Anda inginkan untuk menghasilkan teks lain, misalnya NO seluler, ID ...
sumber
sumber
Anda bisa menggunakan paket acak:
sumber