Yanıtlar:
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:
okur W0703: Catching too general exception Exception
. Yakalanması gereken daha özel bir İstisna var mı yoksa yoksaymalıyım?
Bunu basitçe yapabilirsiniz:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
Elbette yolunuzdaki başka bir filtreyi kullanabilirsiniz, örneğin: /YOU/PATH/*.txt bir dizindeki tüm metin dosyalarını kaldırmak için.
*
gizli dosyaları listelemez, biz de eklemeliyizglob.glob('path/.*)
import sh; sh.rm(files)
import sh; sh.rm(files)
güzel görünmekle birlikte, dizinde 1024'ten fazla dosya varsa sorun yaşarsınız.
Aşağıdakileri kullanarak klasörün kendisini ve tüm içeriğini silebilirsiniz shutil.rmtree
:
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
Dizin ağacının tamamını silme; yol bir dizini işaret etmelidir (ancak bir dizine sembolik bir bağlantı olmamalıdır). Eğer ignore_errors doğrudur, başarısız kaldırma kaynaklanan hatalar göz ardı edilecektir; yanlış veya ihmal varsa, bu tür hatalar tarafından belirtilen bir işleyici çağrılarak işlenir onerror bu atlanırsa veya, eğer bir istisna yükseltmek.
rmtree
. Beğenos.makedirs(dir)
OSError: [Errno 16] Device or resource busy
Mhawke'nin cevabını genişleterek uyguladığım şey bu. Bir klasörün tüm içeriğini kaldırır, ancak klasörün kendisini kaldırmaz. Linux'ta dosya, klasör ve sembolik bağlantılarla test edilmiş, Windows üzerinde de çalışmalıdır.
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
farklı işlemesi gereken dosyaları ve dosyaları bölmek için kullanılır. Ayrıca kullanabilirsiniz os.listdir
, ancak her girişin manuel olarak bir dizin veya dosya olup olmadığını kontrol etmeniz gerekir.
os.walk
burada tekrarlamayacak çünkü bir jeneratör döndürür, çünkü ilerletmeye çalıştığınızda alt dizinlere yalnızca yinelemeli olarak bakar ve bu döngüyü ilk yinelemenizi yaptığınızda, alt dizinler yoktur. bakmak için ayrıldı. Özünde, os.walk
burada üst düzey klasörleri üst düzey dosyalardan ayırmanın alternatif bir yolu olarak kullanılmaktadır; özyineleme kullanılmıyor ve bunun için hiçbir performans maliyeti ödemiyoruz. Yine de eksantriktir ve önerdiğiniz yaklaşımın daha açık ve okunaklı olduğu için daha iyi olduğunu kabul ediyorum.
rmtree
Klasörü kullanmak ve yeniden oluşturmak işe yarayabilir, ancak ağ sürücülerindeki klasörleri siler ve hemen yeniden oluştururken hatalarla karşılaştım.
Walk kullanarak önerilen çözüm, rmtree
klasörleri kaldırmak için kullandığı için çalışmaz ve daha sonra os.unlink
bu klasörlerde bulunan dosyalarda kullanmaya çalışabilir . Bu bir hataya neden olur.
Gönderilen glob
çözüm, boş olmayan klasörleri silmeye ve hatalara neden olmaya çalışır.
Ben kullanmanızı öneririz:
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()
geri döner False
(sembolik bağlantıları takip ettiği için) ve sonunda shutil.rmtree()
bir sembolik bağlantının çağrılmasını sağlarsınız OSError("Cannot call rmtree on a symbolic link")
.
islink
dizinleri doğru şekilde yönlendirmek için burada bir kontrol yapılması gerektiğini belirtmek için doğrudur . Kabul edilen cevaba böyle bir çek ekledim.
Bu:
Kod:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
Diğer birçok yanıtta, bu, dosyaların / dizinlerin kaldırılmasını sağlamak için izinleri ayarlamaya çalışmaz.
Bir oneliner olarak:
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)) ) )
Dosyalar ve dizinler için de daha sağlam bir çözüm (2.7) olacaktır:
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
içinde list
aslında yinelemenizi. Bkz. Http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x
Notlar: Birisinin cevabımı oylamaması durumunda, burada açıklayacağım bir şey var.
shutil.rmtree()
Bir dizin ağacını silmek için kullanılabileceğini biliyorum . Kendi projelerimde birçok kez kullandım. Ancak dizinin kendisinin de tarafından silineceğinishutil.rmtree()
anlamalısınız . Bu bazıları için kabul edilebilir olsa da , bir klasörün içeriğini silmek için geçerli bir cevap değildir (yan etkileri olmadan) .shutil.rmtree()
ve ile yeniden oluşturun os.mkdir()
. Bunun yerine varsayılan (devralınmış) sahip ve mod bitleriyle boş bir dizin elde edersiniz . İçeriği ve hatta dizini silme ayrıcalığınız olsa da, dizindeki orijinal sahibi ve mod bitlerini geri ayarlayamayabilirsiniz (örn. Süper kullanıcı değilsiniz).İşte uzun ve çirkin ama güvenilir ve verimli bir çözüm.
Diğer yanıtlayıcılar tarafından ele alınmayan birkaç sorunu çözer:
shutil.rmtree()
(os.path.isdir()
bir dizine os.walk()
bağlanırsa testi ; hatta sembolik bağlantılı dizinler de içerir).İşte kod (tek kullanışlı fonksiyon 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
, aksinerm
fayda, bunları kendi sürece salt okunur olarak dosyaları silmek için mutludur. Eğer bir dosya varsa arada, yok yalnızca salt okunur erişimi olduğunu kendi, o zaman silemezsiniz ya da izinleri değiştirin. Herhangi bir sistemde salt okunur bir dosyayı silemeyeceğiniz os.remove
ancak izinlerini değiştiremeyeceğiniz bir durum bilmiyorum . Ayrıca, lchmod
Mac bilgisayarımda veya Windows'ta dokümanlarına göre mevcut olmayanları kullanırsınız . Bu kod hangi platform için tasarlanmıştır ?!
Kimsenin pathlib
bu işi yapmak için harikalardan bahsetmediğine şaşırdım .
Yalnızca bir dizindeki dosyaları kaldırmak istiyorsanız, bir oneliner olabilir
from pathlib import Path
[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()]
Ayrıca dizinleri özyinelemeli olarak kaldırmak için şöyle bir şey yazabilirsiniz:
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()
yerine .glob(...)
çalışmalı.
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]
Daha önceki bir yorumda Python 3.5+ sürümünde os.scandir kullanıldığından bahsediliyor. Örneğin:
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()
normal bir dizin ile sembolik bir bağlantı arasında ayrım yapmak için geçerli bir yol değildir. shutil.rmtree()
Sembolik bir bağlantıyı çağırmak OSError
istisnayı artıracaktır .
Bunun os.walk()
için kullanmak daha iyi olabilir .
os.listdir()
dosyaları dizinlerden ayırmaz ve hızlı bir şekilde bunların bağlantısını kaldırmaya çalışırken sorun yaşarsınız. Orada kullanmanın iyi bir örnektir os.walk()
yinelemeli bir dizin kaldırmak için buraya senin koşullarına adapte nasıl ipuçları ve.
Problemi şu şekilde çözerdim:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
Yine Başka Bir Çözüm:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
sh
standart kütüphanenin parçası değildir ve bunu kullanmadan önce PyPI gelen yükleme ihtiyacı var. Ayrıca, bu aslında rm
bir alt işlem gerektirdiğinden, var olmayan Windows üzerinde rm
çalışmaz. Klasör herhangi bir alt dizin içeriyorsa da bir istisna oluşturur.
Ben eski bir iplik konw ama python resmi sitesinden ilginç bir şey buldum. Bir dizindeki tüm içeriği kaldırmak için başka bir fikri paylaşmak içindir. Çünkü shutil.rmtree () kullanırken bazı yetkilendirme sorunlarım var ve dizini kaldırmak ve yeniden oluşturmak istemiyorum. Orijinal adres http://docs.python.org/2/library/os.html#os.walk şeklindedir . Umarım bu birine yardımcı olabilir.
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))
Klasörlerin kendisini kaldırmadan dizindeki tüm dosyaları ve alt dizinlerini silmek için şunları yapın:
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))
* Nix sistemi kullanıyorsanız neden sistem komutundan yararlanmıyorsunuz?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
Tek bir üst dizin içindeki 3 ayrı klasördeki dosyaları kaldırmak zorunda kaldım:
directory
folderA
file1
folderB
file2
folderC
file3
Bu basit kod benim için hile yaptı: (Ben Unix'teyim)
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)
Bu yardımcı olur umarım.
Sınırlı, özel bir durum için yanıt verin: alt klasörler ağacını korurken dosyaları silmek istediğinizi varsayarak, yinelemeli bir algoritma kullanabilirsiniz:
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)
Belki biraz konu dışı, ama bence birçoğu yararlı bulacaktır
os.walk
adresinde gösterilen şekilde kullanmak , dizin yapısını olduğu gibi bırakarak tüm dosyaları silmenin daha iyi bir yoludur.
temp_dir
Silineceği varsayılarak , tek bir satır komutu kullanılarak os
:
_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]
Not: Bu yalnızca dosyaları silmek için 1 astarlıdır 'Dizinleri silmez.
Bu yardımcı olur umarım. Teşekkürler.
Dizinin kendisini değil, bir dizinin içeriğini kaldırmak için aşağıdaki yöntemi kullanın:
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)
bir klasördeki tüm dosyaları silmenin / tüm dosyaları silmenin en kolay yolu
import os
files = os.listdir(yourFilePath)
for f in files:
os.remove(yourFilePath + f)
os.system('rm -rf folder')