python pakush পাইথন দিয়ে খালি থাকা ফোল্ডারটি আমি কিভাবে মুছে ফেলব/মুছে ফেলব?




পাইথন দিয়ে প্রোগ্রামিং শেখা pdf (13)

যখন আমি খালি ফোল্ডারটি মুছে ফেলার চেষ্টা করি তখন আমি একটি 'অ্যাক্সেস অস্বীকার করি' ত্রুটি পাচ্ছি। আমি আমার প্রচেষ্টায় নিম্নলিখিত কমান্ডটি ব্যবহার করেছি: os.remove("/folder_name")

ফাঁকা নয় এমন ফোল্ডার / ডিরেক্টরি মুছে ফেলার / মুছে ফেলার সবচেয়ে কার্যকরী উপায় কী?


Answer #1
import shutil

shutil.rmtree('/folder_name')

স্ট্যান্ডার্ড লাইব্রেরি রেফারেন্স: shutil.rmtree

নকশা দ্বারা, rmtree কেবলমাত্র পঠনযোগ্য ফাইল ধারণকারী ফোল্ডার গাছগুলিতে ব্যর্থ হয়। ফোল্ডারটি মুছে ফেলতে চান তবে এটি কেবলমাত্র পঠনযোগ্য ফাইল রয়েছে কিনা তা নির্বিশেষে ব্যবহার করুন

shutil.rmtree('/folder_name', ignore_errors=True)

Answer #2

আপনি সরলতার জন্য os.system কমান্ড ব্যবহার করতে পারেন:

import os
os.system("rm -rf dirname")

সুস্পষ্ট হিসাবে, এটি আসলে এই কাজটি সম্পন্ন করার জন্য সিস্টেম টার্মিনালকে আহ্বান করে।


Answer #3

docs.python.org থেকে:

এই উদাহরণটি উইন্ডোজের একটি ডিরেক্টরি ট্রি কিভাবে সরানো যায় তা দেখায় যেখানে কিছু ফাইল তাদের কেবল-পঠনযোগ্য বিট সেট থাকে। এটি পঠনযোগ্য বিট সাফ করে সরিয়ে ফেলার জন্য সন্ত্রাসের কলব্যাকটি ব্যবহার করে এবং অপসারণকে পুনরুদ্ধার করে। কোন পরবর্তী ব্যর্থতা প্রচার করা হবে।

import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onerror=remove_readonly)

Answer #4

উপরে উত্তর সম্পূর্ণ করতে কিছু পাইথন 3.5 অপশন। (আমি এখানে তাদের খুঁজে পছন্দ করতেন)।

import os
import shutil
from send2trash import send2trash # (shutil delete permanently)

ফাঁকা ফোল্ডার মুছে ফেলুন

root = r"C:\Users\Me\Desktop\test"   
for dir, subdirs, files in os.walk(root):   
    if subdirs == [] and files == []:
           send2trash(dir)
           print(dir, ": folder removed")

যদি এই ফাইলটি থাকে তবে ফোল্ডারটি মুছুন

    elif subdirs == [] and len(files) == 1: # if contains no sub folder and only 1 file 
        if files[0]== "desktop.ini" or:  
            send2trash(dir)
            print(dir, ": folder removed")
        else:
            print(dir)

ফোল্ডারটি যদি শুধুমাত্র .srt বা .txt ফাইল থাকে তবে এটি মুছুন।

    elif subdirs == []: #if dir doesn’t contains subdirectory
        ext = (".srt", ".txt")
        contains_other_ext=0
        for file in files:
            if not file.endswith(ext):  
                contains_other_ext=True
        if contains_other_ext== 0:
                send2trash(dir)
                print(dir, ": dir deleted")

তার আকার 400kb কম হলে ফোল্ডার মুছুন:

def get_tree_size(path):
    """Return total size of files in given path and subdirs."""
    total = 0
    for entry in os.scandir(path):
        if entry.is_dir(follow_symlinks=False):
            total += get_tree_size(entry.path)
        else:
            total += entry.stat(follow_symlinks=False).st_size
    return total


for dir, subdirs, files in os.walk(root):   
    If get_tree_size(dir) < 400000:  # ≈ 400kb
        send2trash(dir)
    print(dir, "dir deleted")

Answer #5

os.walk() এ পাইথন ডক্স থেকে:

# Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
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))

Answer #6
import os
import stat
import shutil

def errorRemoveReadonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
        # change the file to be readable,writable,executable: 0777
        os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)  
        # retry
        func(path)
    else:
        # raiseenter code here

shutil.rmtree(path, ignore_errors=False, onerror=errorRemoveReadonly) 

Ignore_errors সেট করা হয়, ত্রুটি উপেক্ষা করা হয়; অন্যথায়, যদি সন্ত্রাস সেট করা হয় তবে এটি ত্রুটিগুলি হ্যান্ডেল করার জন্য বলা হয় (func, path, exc_info) যেখানে func হয় os.listdir, os.remove, অথবা os.rmdir; পথটি সেই ফাংশনের যুক্তি যা এটি ব্যর্থ হতে পারে; এবং exc_info একটি tuple sys.exc_info () দ্বারা ফেরত দেওয়া হয়। যদি ignore_errors মিথ্যা এবং সন্ত্রাস হয় না তবে ব্যতিক্রমটি এখানে উত্থাপিত


Answer #7

দশ বছর পরে এবং পাইথন 3.7 এবং লিনাক্স ব্যবহার করে এখনও এটি করার বিভিন্ন উপায় রয়েছে:

import subprocess
from pathlib import Path

#using pathlib.Path
path = Path('/path/to/your/dir')
subprocess.run(["rm", "-rf", str(path)])

#using strings
path = "/path/to/your/dir"
subprocess.run(["rm", "-rf", path])

মূলত এটি পিষ্টন এর সাবপ্রোকেস মডিউল ব্যাশ স্ক্রিপ্টটি $ rm -rf '/path/to/your/dir চালানোর জন্য ব্যবহার করছে যদি আপনি একই কাজ সম্পন্ন করতে টার্মিনালটি ব্যবহার করেন। এটা সম্পূর্ণ Python না, কিন্তু এটা সম্পন্ন পায়।

আমি pathlib.Path অন্তর্ভুক্ত কারণ। pathlib.Path উদাহরণ কারণ আমার অভিজ্ঞতা এটা পরিবর্তন যে অনেক পথ সঙ্গে ডিল করা খুবই দরকারী। pathlib.Path মডিউল আমদানি করার এবং শেষ ফলাফলগুলিতে স্ট্রিংগুলিতে রূপান্তরিত করার অতিরিক্ত পদক্ষেপগুলি প্রায়ই বিকাশের সময়ের জন্য আমার কাছে কম খরচে হয়। Path.rmdir() একটি Path.rmdir() বিকল্পের সাথে স্পষ্টভাবে অ-খালি Path.rmdir() করতে হলে এটি সুবিধাজনক হবে।


Answer #8

আপনি যদি নিশ্চিত হন যে, আপনি পুরো ডির গাছটি মুছে ফেলতে চান এবং ডিরের বিষয়বস্তুতে আর আগ্রহী নন, তাহলে পুরো ডির গাছের জন্য ক্রলিং করা বোকা বুদ্ধিমান ... কেবল পাইথন থেকে নেটিভ ওএস কমান্ডটি করতে এটি কল করুন। এটা দ্রুত, দক্ষ এবং কম মেমরি খাওয়া হবে।

RMDIR c:\blah /s /q 

অথবা * নিক্স

rm -rf /home/whatever 

পাইথন ইন, কোড দেখতে হবে ..

import sys
import os

mswindows = (sys.platform == "win32")

def getstatusoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    if not mswindows:
        return commands.getstatusoutput(cmd)
    pipe = os.popen(cmd + ' 2>&1', 'r')
    text = pipe.read()
    sts = pipe.close()
    if sts is None: sts = 0
    if text[-1:] == '\n': text = text[:-1]
    return sts, text


def deleteDir(path):
    """deletes the path entirely"""
    if mswindows: 
        cmd = "RMDIR "+ path +" /s /q"
    else:
        cmd = "rm -rf "+path
    result = getstatusoutput(cmd)
    if(result[0]!=0):
        raise RuntimeError(result[1])

Answer #9
import shutil
shutil.rmtree(dest, ignore_errors=True)

Answer #10

আমি কোনও ফোল্ডার মুছতে (এমনকি খালি না) মুছতে বা উইন্ডোজ OS এ ফাইলটি খুব সহজ উপায় খুঁজে পেয়েছি।

os.system('powershell.exe  rmdir -r D:\workspace\Branches\*%s* -Force' %CANDIDATE_BRANCH)

Answer #11
def deleteDir(dirPath):
    deleteFiles = []
    deleteDirs = []
    for root, dirs, files in os.walk(dirPath):
        for f in files:
            deleteFiles.append(os.path.join(root, f))
        for d in dirs:
            deleteDirs.append(os.path.join(root, d))
    for f in deleteFiles:
        os.remove(f)
    for d in deleteDirs:
        os.rmdir(d)
    os.rmdir(dirPath)

Answer #12

আপনি shutil মডিউল ব্যবহার করতে না চান, তাহলে আপনি শুধু os মডিউল ব্যবহার করতে পারেন।

from os import listdir, rmdir, remove
for i in listdir(directoryToRemove):
    os.remove(os.path.join(directoryToRemove, i))
rmdir(directoryToRemove) # Now the directory is empty of files

Answer #13

এমনকি যদি এটি অস্তিত্ব নাও হয় তবেও একটি ফোল্ডার মুছে ফেলতে ( চার্লস চৌ এর উত্তরগুলিতে রেস অবস্থা এড়িয়ে যাওয়া) তবে অন্য কিছু ভুল হলে ত্রুটি রয়েছে (উদাহরণস্বরূপ অনুমতি সমস্যা, ডিস্ক পড়া ত্রুটি, ফাইল একটি ডিরেক্টরি নয়)

পাইথন 3.x জন্য:

import shutil

def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, FileNotFoundError):
        return
    raise except_instance

shutil.rmtree(dir_to_delete, onerror=ignore_absent_file)

পাইথন 2.7 কোড প্রায় একই:

import shutil
import errno

def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, OSError) and \
        except_instance.errno == errno.ENOENT:
        return
    raise except_instance

shutil.rmtree(dir_to_delete, onerror=ignore_absent_file)




file