Cara membuat direktori sementara dan mendapatkan path / nama file dengan Python

Jawaban:

210

Gunakan mkdtemp()fungsi dari tempfilemodul:

import tempfile
import shutil

dirpath = tempfile.mkdtemp()
# ... do stuff with dirpath
shutil.rmtree(dirpath)
Philipp
sumber
7
Jika Anda menggunakan ini dalam tes pastikan untuk menghapus (shutil.rmtree) direktori karena itu tidak dihapus secara otomatis setelah digunakan. "Pengguna mkdtemp () bertanggung jawab untuk menghapus direktori sementara dan isinya ketika selesai dengan itu." Lihat: docs.python.org/2/library/tempfile.html#tempfile.mkdtemp
Niels Bom
97
Di python3, Anda dapat melakukannya with tempfile.TemporaryDirectory() as dirpath:, dan direktori sementara akan secara otomatis dibersihkan setelah keluar dari manajer konteks. docs.python.org/3.4/library/…
Symmetric
41

Dalam Python 3, TemporaryDirectory dalam modul tempfile dapat digunakan.

Ini langsung dari contoh :

import tempfile
with tempfile.TemporaryDirectory() as tmpdirname:
     print('created temporary directory', tmpdirname)
# directory and contents have been removed

Jika Anda ingin menyimpan direktori sedikit lebih lama, maka hal seperti ini bisa dilakukan (bukan dari contoh):

import tempfile
import shutil

temp_dir = tempfile.TemporaryDirectory()
print(temp_dir.name)
# use temp_dir, and when done:
shutil.rmtree(temp_dir.name)

Seperti @MatthiasRoelandts tunjukkan, dokumentasi juga mengatakan bahwa "direktori dapat dibersihkan secara eksplisit dengan memanggil cleanup()metode".

Nagev
sumber
2
shutil.rmtree (temp_dir.name) tidak diperlukan.
sidcha
37

Untuk memperluas jawaban lain, berikut adalah contoh yang cukup lengkap yang dapat membersihkan tmpdir bahkan pada pengecualian:

import contextlib
import os
import shutil
import tempfile

@contextlib.contextmanager
def cd(newdir, cleanup=lambda: True):
    prevdir = os.getcwd()
    os.chdir(os.path.expanduser(newdir))
    try:
        yield
    finally:
        os.chdir(prevdir)
        cleanup()

@contextlib.contextmanager
def tempdir():
    dirpath = tempfile.mkdtemp()
    def cleanup():
        shutil.rmtree(dirpath)
    with cd(dirpath, cleanup):
        yield dirpath

def main():
    with tempdir() as dirpath:
        pass # do something here
cdunn2001
sumber
3

Jika saya mendapatkan pertanyaan Anda dengan benar, Anda juga ingin tahu nama-nama file yang dihasilkan di dalam direktori sementara? Jika demikian, coba ini:

import os
import tempfile

with tempfile.TemporaryDirectory() as tmp_dir:
    # generate some random files in it
     files_in_dir = os.listdir(tmp_dir)
Shoval Sadde
sumber