Pertanyaan nomor 10501247 di stackoverflow memberikan jawaban bagaimana cara membuat file sementara dengan Python.
Saya hanya perlu memiliki nama file sementara dalam kasus saya.
Memanggil tempfile.NamedT TemporaryFile () mengembalikan pegangan file setelah pembuatan file sebenarnya.
Apakah ada cara untuk mendapatkan nama file saja?
# Trying to get temp file path
tf = tempfile.NamedTemporaryFile()
temp_file_name = tf.name
tf.close()
# Here is my real purpose to get the temp_file_name
f = gzip.open(temp_file_name ,'wb')
...
python
temporary-files
Bukit
sumber
sumber
NamedTemporaryFile
menjamin nama yang unik, (mungkin) dengan mencobanya dan mencoba lagi jika ada. Hanya mendapatkan nama tidak akan menjamin bahwa Anda benar-benar dapat membuat file nanti, Anda membuka kondisi balapan orang lain yang menggunakan nama yang sama sebelum Anda.Jawaban:
Jika Anda menginginkan nama file temp saja, Anda dapat memanggil fungsi file temporer
_get_candidate_names()
:Memanggil
next
lagi, akan mengembalikan nama lain, dll. Ini tidak memberi Anda jalur ke folder temp. Untuk mendapatkan direktori 'tmp' default, gunakan:sumber
temp_dir = tempfile.mkdtemp(prefix='some-prefix_')
yang akan membuat direktori sementara dengan aman dan mengembalikan string dengan jalur absolut.next(tempfile._get_candidate_names())
tidak selalu mengembalikan jalur yang tidak ada, itulah mengapa antarmuka tempfile tingkat pengguna dapat mencoba beberapa nama sampai yang tidak terpakai ditemukan :tempfile.gettempdir()
daripada pribaditempfile._get_default_tempdir()
.tempfile.mkdtemp
pengguna bertanggung jawab untuk menghapus direktori sementara dan isinya ketika selesai dengannya.Saya pikir cara termudah dan paling aman untuk melakukan ini adalah seperti:
Direktori sementara dibuat yang hanya dapat diakses oleh Anda, jadi seharusnya tidak ada masalah keamanan, tetapi tidak akan ada file yang dibuat di dalamnya, jadi Anda dapat memilih nama file apa pun yang ingin Anda buat di direktori itu.
edit: Dengan Python 3 Anda sekarang dapat menggunakan
tempfile.TemporaryDirectory()
sebagai pengelola konteks untuk menangani penghapusan untuk Anda:sumber
tempfile.mkdtemp
pengguna bertanggung jawab untuk menghapus direktori sementara dan isinya ketika selesai dengannya.tempfile.TemporaryDirectory()
sebagai manajer konteks, itu akan dihapus untuk Anda.Mungkin agak terlambat, tetapi apakah ada yang salah dengan ini?
sumber
without creating actual file in Python
.tempfile.mktemp()
melakukan hal ini.Tetapi perhatikan bahwa itu sudah usang. Namun itu tidak akan membuat file dan itu adalah fungsi publik dalam tempfile dibandingkan dengan menggunakan
_get_candidate_names()
.Alasan tidak digunakan lagi adalah karena jeda waktu antara memanggil ini dan benar-benar mencoba membuat file. Namun dalam kasus saya, peluangnya sangat tipis dan bahkan jika gagal, itu masih dapat diterima. Tetapi terserah Anda untuk mengevaluasi kasus penggunaan Anda.
sumber
tempfile.mktemp
dokumentasi). Sehingga seharusnya tidak dianggap bisa diterima.os.path.join(tempfile.mkdtemp(), 'something')
Setidaknya ada direktori yang dibuat (dan saya anggap milik Anda).Menggabungkan jawaban sebelumnya, solusi saya adalah:
Jadikan
some_id
opsional jika tidak diperlukan untuk Anda.sumber
_get_candidate_names()
tidak ada, seseorang dapat secara default menggunakan beberapa generator string semi-acak. Misalnya beberapa uuid.Seperti yang dikatakan Joachim Isaksson di komentar, jika Anda baru saja mendapatkan nama, Anda mungkin mengalami masalah jika beberapa program lain menggunakan nama itu sebelum program Anda melakukannya. Kemungkinannya tipis, tapi bukan tidak mungkin.
Jadi, hal yang aman untuk dilakukan dalam situasi ini adalah menggunakan konstruktor GzipFile () lengkap, yang memiliki tanda tangan
GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])
. Jadi Anda bisa meneruskannya ke fileobj yang terbuka, dan juga nama file, jika Anda mau. Lihat dokumen gzip untuk detailnya.sumber