অজগর পুনরাবৃত্তিতে ফোল্ডারগুলি মোছা


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/...

উল্লেখ্য উপরের সমস্ত ফোল্ডার খালি রয়েছে are আমি যখন এই স্ক্রিপ্টটি ফোল্ডারগুলি চালাব 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
আপনি কি নিশ্চিত যে তাদের কাছে কোনও লুকানো ফাইল নেই?
জেফ

একটি ব্যতিক্রম বা ট্রেসব্যাক মুদ্রিত হয়? যদি তাই হয় - আপনি যদি প্রশ্নটিতে এটি যোগ করেন তবে এটি সহায়তা করবে
এনগুরে নায়াগা

@ জেফ: হ্যাঁ আমি নিশ্চিত আসলে আমার উবুন্টু মেশিনে আমি চেষ্টা করেছি rmdir /path/to/25th/folderপুরো ডিরেক্টরি মুছে ফেলা। যার অর্থ ডিরেক্টরিটি খালি!
শ্রীরাম

উত্তর:


391

চেষ্টা করুন shutil.rmtree:

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

5
না rmtreeসমগ্র ডিরেক্টরির ডিলিট করলো? আমার ধারণা এটি একইরকমrm -Rf $DIR
শ্রীরাম

7
Rmtree ফাইলগুলিও মুছে ফেলায় সাবধান থাকুন। যেমনটি জিজ্ঞাসা করা হয়েছিল, প্রশ্নটি ছিল কীভাবে EMPTY ডিরেক্টরিগুলি মুছবেন import os for root, dirs, files in os.walk(top, topdown=False): for name in dirs: os.rmdir(os.path.join(root, name))
os OS.Wak এর জন্য নথিগুলি


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
দস্তাবেজ থেকে: "একটি সম্পূর্ণ ডিরেক্টরি ট্রি মুছুন; পাথ অবশ্যই একটি ডিরেক্টরিতে নির্দেশ করবে (তবে কোনও ডিরেক্টরিতে প্রতীকী লিঙ্ক নয়) ignore অনাররারের দ্বারা নির্দিষ্ট কোনও হ্যান্ডলারকে কল করে বা যদি এটি বাদ দেওয়া হয় তবে তারা ব্যতিক্রম বাড়ে। "
মাইক্রো 8

7

নিখুঁত পথ ব্যবহার করা এবং কেবল rmtree ফাংশন আমদানি করা ভাল from shutil import rmtree কারণ এটি একটি বৃহত প্যাকেজ কারণ উপরের লাইনটি কেবল প্রয়োজনীয় ফাংশনটি আমদানি করবে।

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

1
আপনি তারপর এটি হিসাবে উল্লেখ করবে rmtree(); নাshutil.rmtree()
কেভিন মারফি

4

মাইক্রোপথন সমাধান অনুসন্ধানের জন্য কেবল পরবর্তী লোকের জন্য, এটি নিখুঁতভাবে ওএসের (লিস্টডির, অপসারণ, 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

কমান্ড (Tomek কর্তৃক প্রদত্ত) মুছে ফেলতে পারবেন না যদি তা না হয়, একটি ফাইল শুধুমাত্র পাঠযোগ্য । অতএব, কেউ ব্যবহার করতে পারেন -

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। এটি কীভাবে সংজ্ঞায়িত করা হয়েছে?
nnako

1
স্ট্যাটুল মডিউল os.stat (), 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.