python 파일 - 파이썬으로 비어 있지 않은 폴더를 어떻게 제거 / 삭제합니까?




파싱 경로 (13)

비어 있지 않은 폴더를 삭제하려고하면 '액세스가 거부되었습니다.'오류가 발생합니다. 내 시도에서 다음 명령을 사용했습니다 : os.remove("/folder_name") .

비어 있지 않은 폴더 / 디렉토리를 제거 / 삭제하는 가장 효과적인 방법은 무엇입니까?


Answers

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가 설정되면 오류는 무시됩니다. 그렇지 않으면 onerror가 설정된 경우 인수 (func, path, exc_info)를 사용하여 오류를 처리하기 위해 호출됩니다. 여기서 func는 os.listdir, os.remove 또는 os.rmdir입니다. path는 실패한 함수의 인수입니다. exc_info는 sys.exc_info ()에서 반환 한 튜플입니다. ignore_errors가 false이고 onerror가 None 인 경우 예외가 발생합니다. 여기서 코드를 입력하십시오.


python 3.4에서 다음을 사용할 수 있습니다 :

import pathlib

def delete_folder(pth) :
    for sub in pth.iterdir() :
        if sub.is_dir() :
            delete_folder(sub)
        else :
            sub.unlink()
    pth.rmdir() # if you just want to delete dir content, remove this line

여기서 pthpathlib.Path 인스턴스입니다. 좋지만 가장 빠를 수는 없습니다.


확실하다면 전체 dir 트리를 지우고 dir의 내용에 관심이 없으면 전체 dir 트리를 크롤링하는 것은 어리 석다 ... 파이썬에서 네이티브 OS 명령을 호출하면됩니다. 더 빠르고 효율적이며 적은 메모리를 소비합니다.

RMDIR c:\blah /s /q 

또는 * nix

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])

docs.python.org :

이 예는 일부 파일에 읽기 전용 비트가 설정된 Windows에서 디렉토리 트리를 제거하는 방법을 보여줍니다. onerror 콜백을 사용하여 읽기 전용 비트를 지우고 제거를 다시 시도합니다. 이후의 실패는 전파됩니다.

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)

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

Windows OS 에서 모든 폴더 (심지어 비어 있지 않음) 또는 파일을 삭제하는 매우 쉬운 방법을 발견했습니다.

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

import shutil
shutil.rmtree(dest, ignore_errors=True)

위의 해답을 완성하기위한 파이썬 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")

폴더가 존재하지 않을지라도 ( Charles Chow의 응답 에서 경쟁 조건을 피하면서), 다른 것들이 잘못되었을 때 (예 : 권한 문제, 디스크 읽기 오류, 파일이 디렉토리가 아님) 오류가 발생하더라도 삭제하십시오.

파이썬 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)

Python 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)

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)

kkubasik의 답변을 바탕으로 제거하기 전에 폴더가 있는지 확인하고보다 견고합니다

import shutil
def remove_folder(path):
    # check if folder exists
    if os.path.exists(path):
         # remove if exists
         shutil.rmtree(path)
remove_folder("/folder_name")

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))

파이썬 삼항 연산자를 시뮬레이트합니다.

예를 들어

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

산출:

'b greater than a'




python file