अजगर को पुनरावर्ती में फ़ोल्डर हटाना


202

मुझे खाली निर्देशिकाओं को हटाने में समस्या हो रही है। यहाँ मेरा कोड है:

for dirpath, dirnames, filenames in os.walk(dir_to_search):
    //other codes

    try:
        os.rmdir(dirpath)
    except OSError as ex:
        print(ex)

तर्क dir_to_searchयह है कि मैं उस निर्देशिका को पारित कर रहा हूं जहां काम करने की आवश्यकता है। यह निर्देशिका इस तरह दिखती है:

test/20/...
test/22/...
test/25/...
test/26/...

ध्यान दें कि उपरोक्त सभी फ़ोल्डर खाली हैं। जब मैं इस स्क्रिप्ट को चलाता है 20, तो 25अकेला डिलीट हो जाता है! लेकिन फ़ोल्डर 25और 26हटाए नहीं गए हैं, भले ही वे खाली फ़ोल्डर हैं।

संपादित करें:

मुझे जो अपवाद मिल रहे हैं, वे हैं:

[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/29/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/28/tmp'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/26'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/25'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27'
[Errno 39] Directory not empty: '/home/python-user/shell-scripts/s3logs/test/2012/10/27/tmp'

मैं कहां गलती कर रहा हूं?


1
क्या आप सुनिश्चित हैं कि उनके पास छिपी हुई फाइलें नहीं हैं?
जेफ

क्या कोई अपवाद या ट्रेसबैक मुद्रित है? यदि ऐसा है तो यह मदद करेगा यदि आप इस प्रश्न को
जोड़ते हैं

@ जेफ़: हाँ मुझे यकीन है। वास्तव में मेरे ubuntu मशीन में मैंने कोशिश rmdir /path/to/25th/folderकी पूरी निर्देशिका को हटा रहा है। जिसका अर्थ है कि निर्देशिका एक खाली है!
श्रीराम

जवाबों:


391

कोशिश करें shutil.rmtree:

import shutil
shutil.rmtree('/path/to/your/dir/')

5
क्या rmtreeपूरी निर्देशिका को हटा दिया गया है? मुझे लगता है कि यह एक समान हैrm -Rf $DIR
श्रीराम

7
सावधान रहें क्योंकि rmtree फ़ाइलों को भी हटा देता है। जैसा कि पूछा गया, सवाल यह था कि EMPTY निर्देशिकाओं को कैसे हटाया जाए। os.walk के लिए डॉक्स एक उदाहरण देते हैं जो लगभग इस प्रश्न से मेल खाता है: import os for root, dirs, files in os.walk(top, topdown=False): for name in dirs: os.rmdir(os.path.join(root, name))
डेवसॉयर

पायथन 3 संस्करण डॉक्स: docs.python.org/3/library/shutil.html#shutil.rmtree
व्लादिमीर

27

डिफ़ॉल्ट व्यवहार os.walk()रूट से लीफ तक चलना है। सेट topdown=Falseमें os.walk()पत्ती से जड़ तक चलने के लिए।


18

यहाँ मेरा शुद्ध pathlibपुनरावर्ती निर्देशिका लिंक है:

from pathlib import Path

def rmdir(directory):
    directory = Path(directory)
    for item in directory.iterdir():
        if item.is_dir():
            rmdir(item)
        else:
            item.unlink()
    directory.rmdir()

rmdir(Path("dir/"))

12

प्रयास करें rmtree()में shutilअजगर मानक पुस्तकालय से


1
क्या rmtreeपूरी निर्देशिका को हटा दिया गया है? मुझे लगता है कि यह एक समान हैrm -Rf $DIR
श्रीराम

2
डॉक्स से: "संपूर्ण डाइरेक्टरी ट्री को हटाएं; पथ को एक डायरेक्टरी (लेकिन किसी डायरेक्टरी का प्रतीकात्मक लिंक नहीं) की ओर इशारा करना चाहिए। अगर ign_errors सत्य है, तो निष्कासन निष्कासन से उत्पन्न त्रुटियों को नजरअंदाज कर दिया जाएगा; यदि गलत या लोप किया गया हो, तो ऐसी त्रुटियां नियंत्रित की जाती हैं। ऑनरोर द्वारा निर्दिष्ट हैंडलर को कॉल करके या, यदि वह छोड़ा गया है, तो वे एक अपवाद बढ़ाते हैं। "
माइक्रोओ 8

7

निरपेक्ष पथ का उपयोग करने के लिए बेहतर है और केवल rmtree फ़ंक्शन from shutil import rmtree को आयात करें क्योंकि यह एक बड़ा पैकेज है उपरोक्त रेखा केवल आवश्यक फ़ंक्शन को आयात करेगी।

from shutil import rmtree
rmtree('directory-absolute-path')

1
फिर आप इसे इस रूप में संदर्भित करेंगे rmtree(); नहींshutil.rmtree()
केविन मर्फी

4

बस अगले आदमी के लिए एक micropython समाधान के लिए खोज, यह पूरी तरह से ओएस (listdir, निकालें, rmdir) पर आधारित काम करता है। यह न तो पूर्ण है (विशेष रूप से एररहैंडलिंग में) और न ही फैंसी है, हालांकि यह ज्यादातर परिस्थितियों में काम करेगा।

def deltree(target):
    print("deltree", target)
    for d in os.listdir(target):
        try:
            deltree(target + '/' + d)
        except OSError:
            os.remove(target + '/' + d)

    os.rmdir(target)

3

कमांड (टोमेक द्वारा दी गई) एक फ़ाइल को हटा नहीं सकती है , अगर इसे केवल पढ़ा जाता है । इसलिए, एक का उपयोग कर सकते हैं -

import os, sys
import stat

def del_evenReadonly(action, name, exc):
    os.chmod(name, stat.S_IWRITE)
    os.remove(name)

if  os.path.exists("test/qt_env"):
    shutil.rmtree('test/qt_env',onerror=del_evenReadonly)

2
जब मेरे अपने फ़ोल्डर के साथ अपने कोड हटाए जाने के लिए कोशिश कर रहा है, मैं कह रहा कोई त्रुटि मिलती है: NameError: name 'stat' is not defined। इसे कैसे परिभाषित किया गया है?
nnno

1
स्टेट मॉड्यूल, स्थिरांक (), os.fstat () और os.lstat () के परिणामों की व्याख्या करने के लिए स्थिरांक और कार्यों को परिभाषित करता है। आप क्या कोशिश कर सकते हैं: आयात ओ एस, स्टेट आयात से एसटीएस *
मोनिर

0

यहां एक और शुद्ध-पैथलिब समाधान है , लेकिन पुनरावृत्ति के बिना :

from pathlib import Path
from typing import Union

def del_empty_dirs(base: Union[Path, str]):
    base = Path(base)
    for p in sorted(base.glob('**/*'), reverse=True):
        if p.is_dir():
            p.chmod(0o666)
            p.rmdir()
        else:
            raise RuntimeError(f'{p.parent} is not empty!')
    base.rmdir()

-1

यहाँ एक पुनरावर्ती समाधान है:

def clear_folder(dir):
    if os.path.exists(dir):
        for the_file in os.listdir(dir):
            file_path = os.path.join(dir, the_file)
            try:
                if os.path.isfile(file_path):
                    os.unlink(file_path)
                else:
                    clear_folder(file_path)
                    os.rmdir(file_path)
            except Exception as e:
                print(e)

-1

लिनक्स उपयोगकर्ताओं के लिए, आप केवल शेल कमांड को पाइथोनिक तरीके से चला सकते हैं

import os
os.system("rm -r /home/user/folder_name")

जहां rmके लिए खड़ा है निकालें और -rके लिए रिकर्सिवली

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.