जवाबों:
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:
कि पढ़ता है के साथ एक चेतावनी मिल रहा है W0703: Catching too general exception Exception
। क्या पकड़ने के लिए एक अधिक विशिष्ट अपवाद है या मुझे इसे अनदेखा करना चाहिए?
आप बस यह कर सकते हैं:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
आप निश्चित रूप से आप पथ में एक अन्य फिल्टर का उपयोग कर सकते हैं, उदाहरण के लिए: /YOU/PATH/*.txt एक निर्देशिका में सभी पाठ फ़ाइलों को हटाने के लिए।
*
नहीं सूची छिपी फ़ाइलें, हम भी जोड़ना चाहिए होगाglob.glob('path/.*)
import sh; sh.rm(files)
import sh; sh.rm(files)
भी प्रेट्रियर दिखता है, आप निर्देशिका में 1024 से अधिक फाइलें होने पर परेशानी में पड़ जाते हैं।
आप फ़ोल्डर का उपयोग कर, साथ ही इसकी सभी सामग्रियों को हटा सकते हैं shutil.rmtree
:
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
एक पूरी निर्देशिका ट्री हटाएं; पथ को एक निर्देशिका की ओर इंगित करना चाहिए (लेकिन किसी निर्देशिका का प्रतीकात्मक लिंक नहीं)। अगर ign_errors सच है, तो विफल निष्कासन से उत्पन्न त्रुटियों को अनदेखा किया जाएगा; यदि गलत या छोड़ा गया है, तो ऐसी त्रुटियां ऑनरोर द्वारा निर्दिष्ट हैंडलर को कॉल करके या यदि छोड़ दिया जाता है, तो वे अपवाद को उठाते हैं।
rmtree
। जैसेos.makedirs(dir)
OSError: [Errno 16] Device or resource busy
शावके के जवाब पर विस्तार करते हुए मैंने इसे लागू किया है। यह एक फ़ोल्डर की सभी सामग्री को हटाता है लेकिन फ़ोल्डर को ही नहीं। फ़ाइलों, फ़ोल्डरों और प्रतीकात्मक लिंक के साथ लिनक्स पर परीक्षण किया जाना चाहिए, साथ ही विंडोज पर भी काम करना चाहिए।
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
डायरियों बनाम फ़ाइलों को विभाजित करने के लिए उपयोग किया जाता है, जिसे अलग तरीके से संभाला जाना चाहिए। आप भी उपयोग कर सकते हैं os.listdir
, लेकिन आपको यह जांचना होगा कि प्रत्येक प्रविष्टि मैन्युअल रूप से डीआईआर या फ़ाइल है या नहीं।
os.walk
यहाँ फिर से नहीं आएगा, क्योंकि यह एक जनरेटर लौटाता है जब आप इसे आगे बढ़ाने की कोशिश करते हैं, तो केवल एक ही सबटैक्टरी में दिखता है, और जब तक आप इस लूप का अपना पहला पुनरावृत्ति कर लेते हैं, तब तक कोई उपनिर्देशिका नहीं होती है देखने के लिए छोड़ दिया। संक्षेप में, os.walk
बस यहां शीर्ष-स्तरीय फ़ाइलों से शीर्ष-स्तरीय फ़ोल्डरों को अलग करने के वैकल्पिक तरीके के रूप में उपयोग किया जा रहा है; पुनरावृत्ति का उपयोग नहीं किया जा रहा है और हम इसके लिए कोई प्रदर्शन लागत नहीं देते हैं। हालांकि यह सनकी है, और मैं मानता हूं कि आपके द्वारा सुझाया गया दृष्टिकोण बेहतर है, क्योंकि यह अधिक स्पष्ट और पठनीय है।
rmtree
फ़ोल्डर का उपयोग करना और उसे फिर से बनाना काम कर सकता है, लेकिन मैं नेटवर्क ड्राइव पर फ़ोल्डर को हटाते और तुरंत पुनः बनाए जाने पर त्रुटियों में चला गया हूं।
वॉक का उपयोग करने वाला प्रस्तावित समाधान उन फ़ोल्डरों rmtree
को हटाने के लिए काम नहीं करता है जैसा कि वह फ़ोल्डर को हटाने के लिए उपयोग करता है और फिर os.unlink
उन फ़ाइलों पर उपयोग करने का प्रयास कर सकता है जो पहले उन फ़ोल्डरों में थे। यह एक त्रुटि का कारण बनता है।
पोस्ट किया गया glob
समाधान गैर-खाली फ़ोल्डरों को हटाने का प्रयास करेंगे, जिससे त्रुटियां हो सकती हैं।
मेरा सुझाव है कि आप उपयोग करें:
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()
तो वापस आ जाएगी False
(क्योंकि यह सिमिलिंक का अनुसरण करता है), और आप shutil.rmtree()
सिमिलिंक पर कॉल करना समाप्त कर देंगे , जो उठाएंगे OSError("Cannot call rmtree on a symbolic link")
।
islink
ढंग से निर्देशिकाओं के लिए सहानुभूति को संभालने के लिए यहां एक जांच की आवश्यकता को इंगित करने के लिए सही है। मैंने ऐसे चेक को स्वीकृत उत्तर में जोड़ दिया है।
इस:
कोड:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
कई अन्य उत्तरों के रूप में, यह फ़ाइलों / निर्देशिकाओं को हटाने में सक्षम करने के लिए अनुमतियों को समायोजित करने का प्रयास नहीं करता है।
ऑनलाइनर के रूप में:
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)) ) )
फ़ाइलों और निर्देशिकाओं के लिए एक अधिक मजबूत समाधान लेखांकन होगा (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
में list
वास्तव में पुनरावृति करने के लिए। देखें http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x
नोट: यदि किसी ने मेरे उत्तर को अस्वीकार कर दिया है, तो मुझे यहाँ कुछ समझाना होगा।
shutil.rmtree()
एक निर्देशिका पेड़ को हटाने के लिए इस्तेमाल किया जा सकता है। मैंने इसे अपनी परियोजनाओं में कई बार उपयोग किया है। लेकिन आपको महसूस करना चाहिए कि निर्देशिका को भी हटा दिया जाएगाshutil.rmtree()
। हालांकि यह कुछ के लिए स्वीकार्य हो सकता है, यह एक फ़ोल्डर की सामग्री को हटाने के लिए एक वैध जवाब नहीं है (साइड इफेक्ट्स के बिना) ।shutil.rmtree()
और इसके साथ पुनर्निर्माण करें os.mkdir()
। और आपको इसके बजाय डिफ़ॉल्ट (विरासत में मिला) के मालिक और मोड बिट्स के साथ एक खाली निर्देशिका मिलेगी । हालांकि आपको सामग्री और यहां तक कि निर्देशिका को हटाने का विशेषाधिकार प्राप्त हो सकता है, आप निर्देशिका पर मूल स्वामी और मोड बिट्स को वापस सेट करने में सक्षम नहीं हो सकते हैं (जैसे कि आप एक सुपरयूज़र नहीं हैं)।यहाँ एक लंबा और बदसूरत, लेकिन विश्वसनीय और कुशल समाधान है।
यह कुछ समस्याओं का समाधान करता है जो अन्य उत्तरदाताओं द्वारा संबोधित नहीं की जाती हैं:
shutil.rmtree()
एक प्रतीकात्मक लिंक पर कॉल नहीं करना शामिल है (जो os.path.isdir()
कि एक निर्देशिका से लिंक होने पर परीक्षा पास करेगा , यहां तक कि os.walk()
प्रतीकात्मक लिंक वाली निर्देशिका भी शामिल है)।यहाँ कोड (केवल उपयोगी कार्य है 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
, के विपरीतrm
उपयोगिता, जब तक आप उनके स्वामी के रूप में केवल पढ़ने के लिए फ़ाइलों को हटाने के लिए खुश है। इस बीच, यदि यह एक ऐसी फाइल है जो आपके पास नहीं है तो आपके पास केवल आसानी से पहुंच है, तो आप इसे हटा नहीं सकते हैं या इसकी अनुमति नहीं बदल सकते हैं । मैं किसी भी प्रणाली पर ऐसी कोई स्थिति नहीं जानता जहाँ आप os.remove
अपनी अनुमतियों को बदलने में सक्षम होने के साथ आसानी से फ़ाइल को हटाने में असमर्थ हों । इसके अलावा, आप उपयोग करते हैं lchmod
, जो मेरे मैक पर मौजूद नहीं है, न ही विंडोज पर इसके डॉक्स के अनुसार। क्या कोड इस कोड के लिए है ?!
मुझे आश्चर्य है कि किसी ने भी pathlib
इस काम को करने का ज़िक्र नहीं किया ।
यदि आप केवल निर्देशिका में फ़ाइलों को निकालना चाहते हैं तो यह ऑनलाइनर हो सकता है
from pathlib import Path
[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()]
पुनरावर्ती निर्देशिकाओं को हटाने के लिए आप कुछ इस तरह लिख सकते हैं:
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()
इसके बजाय .glob(...)
भी काम करना चाहिए।
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]
पहले की टिप्पणी में पायथन 3.5+ में os.scandir का उपयोग करने का भी उल्लेख है। उदाहरण के लिए:
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()
एक नियमित निर्देशिका और एक प्रतीकात्मक लिंक के बीच अंतर करने का एक वैध तरीका नहीं है। shutil.rmtree()
प्रतीकात्मक लिंक पर कॉल करना OSError
अपवाद को बढ़ाएगा ।
आप इसके लिए बेहतर उपयोग कर सकते हैं os.walk()
।
os.listdir()
निर्देशिकाओं से फ़ाइलों को अलग नहीं करता है और आप जल्दी से इन को अनलिंक करने की कोशिश में परेशानी में पड़ जाएंगे। यहाँos.walk()
किसी निर्देशिका को पुनरावर्ती रूप से निकालने के लिए , और इसे आपकी परिस्थितियों के अनुकूल कैसे बनाया जाए, इसका उपयोग करने का एक अच्छा उदाहरण है।
मैं इस तरह से समस्या का समाधान करता था:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
अभी तक एक और समाधान:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
sh
मानक पुस्तकालय का हिस्सा नहीं है और आपको इसे इस्तेमाल करने से पहले PyPI से इंस्टॉल करने की आवश्यकता है। इसके अलावा, चूंकि यह वास्तव rm
में एक उपप्रकार में आक्रमण करता है, यह विंडोज पर काम नहीं करेगा जहां rm
मौजूद नहीं है। यदि फ़ोल्डर में कोई उपनिर्देशिका है, तो यह एक अपवाद भी बढ़ाएगा।
मुझे पता है कि यह एक पुराना धागा है लेकिन मुझे अजगर की आधिकारिक साइट से कुछ दिलचस्प मिला है। बस एक निर्देशिका में सभी सामग्री को हटाने के लिए एक और विचार साझा करने के लिए। क्योंकि मुझे shutil.rmtree () का उपयोग करते समय प्राधिकरण की कुछ समस्याएं हैं और मैं निर्देशिका को हटाकर इसे फिर से बनाना नहीं चाहता। मूल पता http://docs.python.org/2/library/os.html#os.walk है । आशा है कि किसी की मदद कर सकता है।
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))
निर्देशिका के अंदर सभी फ़ाइलों को हटाने के लिए और साथ ही इसके उप-निर्देशिकाओं को, फ़ोल्डर्स को हटाने के बिना, बस यह करें:
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))
यदि आप एक * निक्स प्रणाली का उपयोग कर रहे हैं, तो सिस्टम कमांड का लाभ क्यों नहीं उठाते हैं?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
मुझे सिंगल पेरेंट डायरेक्टरी के अंदर 3 अलग-अलग फोल्डर से फाइलें निकालनी थीं:
directory
folderA
file1
folderB
file2
folderC
file3
इस सरल कोड ने मेरे लिए चाल चली: (मैं यूनिक्स पर हूँ)
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)
उम्मीद है की यह मदद करेगा।
सीमित, विशिष्ट स्थिति के लिए उत्तर: मान लें कि आप सबफ़ोल्डर्स ट्री को बनाए रखते हुए फ़ाइलों को हटाना चाहते हैं, तो आप पुनरावर्ती एल्गोरिदम का उपयोग कर सकते हैं:
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)
शायद थोड़ा ऑफ-टॉपिक, लेकिन मुझे लगता है कि कई इसे उपयोगी पाएंगे
os.walk
जिस तरह से में दिखाया में stackoverflow.com/a/54889532/1709587 शायद जबकि निर्देशिका संरचना बरकरार छोड़ने सभी फ़ाइलों को हटाने के एक अच्छे तरीका है।
temp_dir
हटाए जाने की मानें , तो एक एकल पंक्ति कमांड का उपयोग os
किया जाएगा:
_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]
नोट: यह फ़ाइलों को हटाने के लिए केवल 1-लाइनर है 'निर्देशिकाओं को नहीं हटाता है।
उम्मीद है की यह मदद करेगा। धन्यवाद।
डायरेक्टरी की सामग्री को हटाने के लिए मेथड बेलो का प्रयोग करें, न कि डायरेक्टरी का:
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)
os.system('rm -rf folder')