Jawaban:
import os, shutil
folder = '/path/to/folder'
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
try:
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
except Exception as e:
print('Failed to delete %s. Reason: %s' % (file_path, e))
except Exception as e:
itu W0703: Catching too general exception Exception
. Apakah ada Pengecualian yang lebih spesifik untuk ditangkap atau haruskah saya abaikan?
Anda cukup melakukan ini:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
Anda tentu saja dapat menggunakan filter lain di jalur Anda, misalnya: /YOU/PATH/*.txt untuk menghapus semua file teks dalam direktori.
*
tidak akan mencantumkan file tersembunyi, kami juga harus menambahkanglob.glob('path/.*)
import sh; sh.rm(files)
import sh; sh.rm(files)
terlihat lebih cantik, Anda mengalami masalah jika ada lebih dari 1024 file dalam direktori.
Anda dapat menghapus folder itu sendiri, serta semua isinya, menggunakan shutil.rmtree
:
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
Hapus seluruh pohon direktori; path harus mengarah ke direktori (tetapi bukan tautan simbolis ke direktori). Jika ign_errors benar, kesalahan yang dihasilkan dari penghapusan yang gagal akan diabaikan; jika salah atau dihilangkan, kesalahan tersebut ditangani dengan memanggil pawang yang ditentukan oleh onerror atau, jika dihilangkan, mereka menimbulkan pengecualian.
rmtree
. Sepertios.makedirs(dir)
OSError: [Errno 16] Device or resource busy
Memperluas jawaban mhawke inilah yang telah saya terapkan. Ini menghapus semua konten folder tetapi tidak folder itu sendiri. Diuji di Linux dengan file, folder, dan tautan simbolis, harus bekerja pada Windows juga.
import os
import shutil
for root, dirs, files in os.walk('/path/to/folder'):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
walk
digunakan untuk membagi dirs vs file, yang harus ditangani secara berbeda. Anda juga dapat menggunakan os.listdir
, tetapi Anda harus memeriksa apakah setiap entri adalah direktori atau file secara manual.
os.walk
tidak akan muncul kembali di sini, karena mengembalikan generator satu-satunya yang secara rekursif melihat ke subdirektori ketika Anda mencoba untuk memajukannya, dan pada saat Anda telah melakukan iterasi pertama dari loop ini, tidak ada subdirektori kiri untuk melihat. Pada dasarnya, os.walk
hanya digunakan di sini sebagai cara alternatif untuk membedakan folder tingkat atas dari file tingkat atas; rekursi tidak digunakan dan kami tidak membayar biaya kinerja untuk itu. Namun, ini eksentrik, dan saya setuju bahwa pendekatan yang Anda sarankan lebih baik hanya karena lebih eksplisit dan mudah dibaca.
Menggunakan rmtree
dan membuat ulang folder bisa berfungsi, tetapi saya mengalami kesalahan saat menghapus dan segera membuat kembali folder pada drive jaringan.
Solusi yang diusulkan menggunakan walk tidak berfungsi seperti yang digunakan rmtree
untuk menghapus folder dan kemudian dapat mencoba untuk menggunakan os.unlink
file yang sebelumnya ada di folder tersebut. Ini menyebabkan kesalahan.
glob
Solusi yang diposting juga akan mencoba untuk menghapus folder yang tidak kosong, menyebabkan kesalahan.
Saya sarankan Anda menggunakan:
folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
file_object_path = os.path.join(folder_path, file_object)
if os.path.isfile(file_object_path) or os.path.islink(file_object_path):
os.unlink(file_object_path)
else:
shutil.rmtree(file_object_path)
os.path.isfile()
akan kembali False
(karena ia mengikuti symlinks), dan Anda akhirnya akan memanggil shutil.rmtree()
symlink, yang akan muncul OSError("Cannot call rmtree on a symbolic link")
.
islink
pemeriksaan di sini untuk menangani symlink ke direktori dengan benar. Saya telah menambahkan tanda centang pada jawaban yang diterima.
Ini:
Kode:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
Seperti banyak jawaban lain, ini tidak mencoba untuk menyesuaikan izin untuk memungkinkan penghapusan file / direktori.
Sebagai oneliner:
import os
# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )
Solusi yang lebih kuat untuk file dan direktori juga adalah (2.7):
def rm(f):
if os.path.isdir(f): return os.rmdir(f)
if os.path.isfile(f): return os.unlink(f)
raise TypeError, 'must be either file or directory'
map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir))))
map
di list
untuk benar-benar iterate. Lihat http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x
Catatan: kalau-kalau ada orang yang memilih jawaban saya, saya punya sesuatu untuk dijelaskan di sini.
shutil.rmtree()
bisa digunakan untuk menghapus pohon direktori. Saya telah menggunakannya berkali-kali dalam proyek saya sendiri. Tetapi Anda harus menyadari bahwa direktori itu sendiri juga akan dihapus olehshutil.rmtree()
. Meskipun ini mungkin dapat diterima untuk beberapa orang, itu bukan jawaban yang valid untuk menghapus isi folder (tanpa efek samping) .shutil.rmtree()
dan membangun kembali dengan os.mkdir()
. Dan Anda akan mendapatkan direktori kosong dengan pemilik default (inherit) dan bit mode sebagai gantinya. Meskipun Anda mungkin memiliki hak istimewa untuk menghapus konten dan bahkan direktori, Anda mungkin tidak dapat mengatur kembali pemilik asli dan bit mode pada direktori (misalnya Anda bukan pengguna super).Inilah solusi yang panjang dan jelek, tetapi dapat diandalkan dan efisien.
Ini menyelesaikan beberapa masalah yang tidak ditangani oleh penjawab lain:
shutil.rmtree()
tautan simbolik (yang akan lulus os.path.isdir()
tes jika tautannya ke direktori; bahkan hasil os.walk()
berisi direktori yang terkait simbolik juga).Berikut kodenya (satu-satunya fungsi yang bermanfaat adalah clear_dir()
):
import os
import stat
import shutil
# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
# Handle read-only files and directories
if fn is os.rmdir:
os.chmod(path_, stat.S_IWRITE)
os.rmdir(path_)
elif fn is os.remove:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
def force_remove_file_or_symlink(path_):
try:
os.remove(path_)
except OSError:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
# Code from shutil.rmtree()
def is_regular_dir(path_):
try:
mode = os.lstat(path_).st_mode
except os.error:
mode = 0
return stat.S_ISDIR(mode)
def clear_dir(path_):
if is_regular_dir(path_):
# Given path is a directory, clear its content
for name in os.listdir(path_):
fullpath = os.path.join(path_, name)
if is_regular_dir(fullpath):
shutil.rmtree(fullpath, onerror=_remove_readonly)
else:
force_remove_file_or_symlink(fullpath)
else:
# Given path is a file or a symlink.
# Raise an exception here to avoid accidentally clearing the content
# of a symbolic linked directory.
raise OSError("Cannot call clear_dir() on a symbolic link")
os.remove
, tidak seperti yang rm
utilitas, senang untuk menghapus read-only file selama Anda memiliki mereka. Sementara itu, jika itu adalah file yang bukan milik Anda yang hanya memiliki akses baca saja, maka Anda tidak dapat menghapusnya atau mengubah izinnya. Saya tidak tahu situasi apa pun di sistem mana pun di mana Anda tidak dapat menghapus file yang os.remove
hanya bisa dibaca dengan belum dapat mengubah izinnya. Selanjutnya, Anda menggunakan lchmod
, yang tidak ada di Mac saya, atau di Windows sesuai dengan dokumennya. Untuk platform apa kode ini dibuat ?!
Saya terkejut tidak ada yang menyebutkan yang luar biasa pathlib
untuk melakukan pekerjaan ini.
Jika Anda hanya ingin menghapus file dalam direktori, itu bisa menjadi oneliner
from pathlib import Path
[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()]
Untuk juga menghapus direktori secara rekursif Anda dapat menulis sesuatu seperti ini:
from pathlib import Path
from shutil import rmtree
for path in Path("/path/to/folder").glob("**/*"):
if path.is_file():
path.unlink()
elif path.is_dir():
rmtree(path)
.iterdir()
alih-alih .glob(...)
juga harus bekerja.
import os
import shutil
# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]
# Iterate and remove each item in the appropriate manner
[os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]
Komentar sebelumnya juga menyebutkan menggunakan os.scandir dalam Python 3.5+. Sebagai contoh:
import os
import shutil
with os.scandir(target_dir) as entries:
for entry in entries:
if entry.is_file() or entry.is_symlink():
os.remove(entry.path)
elif entry.is_dir():
shutil.rmtree(entry.path)
os.path.isdir()
bukan cara yang valid untuk membedakan antara direktori biasa dan tautan simbolik. Memanggil shutil.rmtree()
tautan simbolis akan memunculkan OSError
pengecualian.
Anda mungkin lebih baik menggunakan os.walk()
ini.
os.listdir()
tidak membedakan file dari direktori dan Anda akan dengan cepat mendapat kesulitan mencoba memutuskan tautan ini. Ada contoh yang baik tentang penggunaan os.walk()
untuk menghapus direktori secara rekursif di sini , dan memberi petunjuk tentang cara menyesuaikannya dengan keadaan Anda.
Saya biasa memecahkan masalah dengan cara ini:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
Solusi Lain:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
sh
itu bukan bagian dari pustaka standar dan perlu menginstal dari PyPI sebelum Anda dapat menggunakannya. Juga, karena ini benar-benar memanggil rm
dalam suatu proses, itu tidak akan bekerja pada Windows di mana rm
tidak ada. Ini juga akan memunculkan pengecualian jika folder tersebut berisi subdirektori.
Saya tahu itu adalah utas lama tetapi saya telah menemukan sesuatu yang menarik dari situs resmi python. Hanya untuk berbagi ide lain untuk menghapus semua konten dalam direktori. Karena saya memiliki beberapa masalah otorisasi ketika menggunakan shutil.rmtree () dan saya tidak ingin menghapus direktori dan membuatnya kembali. Alamat asli adalah http://docs.python.org/2/library/os.html#os.walk . Semoga itu bisa membantu seseorang.
def emptydir(top):
if(top == '/' or top == "\\"): return
else:
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
Untuk menghapus semua file di dalam direktori serta sub-direktori, tanpa menghapus foldernya sendiri, cukup lakukan ini:
import os
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
for file in files:
os.remove(os.path.join(root, file))
Jika Anda menggunakan sistem * nix, mengapa tidak memanfaatkan perintah sistem?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
Saya harus menghapus file dari 3 folder terpisah di dalam direktori induk tunggal:
directory
folderA
file1
folderB
file2
folderC
file3
Kode sederhana ini membantu saya: (Saya menggunakan Unix)
import os
import glob
folders = glob.glob('./path/to/parentdir/*')
for fo in folders:
file = glob.glob(f'{fo}/*')
for f in file:
os.remove(f)
Semoga ini membantu.
Jawaban untuk situasi terbatas dan spesifik: dengan asumsi Anda ingin menghapus file sambil mempertahankan pohon subfolder, Anda bisa menggunakan algoritma rekursif:
import os
def recursively_remove_files(f):
if os.path.isfile(f):
os.unlink(f)
elif os.path.isdir(f):
for fi in os.listdir(f):
recursively_remove_files(os.path.join(f, fi))
recursively_remove_files(my_directory)
Mungkin sedikit di luar topik, tapi saya pikir banyak yang akan merasa berguna
os.walk
dengan cara yang ditunjukkan di stackoverflow.com/a/54889532/1709587 mungkin merupakan cara yang lebih baik untuk menghapus semua file sambil membiarkan struktur direktori tetap utuh.
Gunakan metode di bawah ini untuk menghapus konten direktori, bukan direktori itu sendiri:
import os
import shutil
def remove_contents(path):
for c in os.listdir(path):
full_path = os.path.join(path, c)
if os.path.isfile(full_path):
os.remove(full_path)
else:
shutil.rmtree(full_path)
cara termudah untuk menghapus semua file dalam folder / hapus semua file
import os
files = os.listdir(yourFilePath)
for f in files:
os.remove(yourFilePath + f)
os.system('rm -rf folder')