Pythonで空でないフォルダを削除/削除するにはどうすればいいですか?

file python
Pythonで空でないフォルダを削除/削除するにはどうすればいいですか?

空ではないフォルダを削除しようとすると、「アクセスが拒否されました」というエラーが表示されます。 私は次のコマンドを使いました: os.remove(" / folder_name ")

空ではないフォルダ/ディレクトリを削除/削除する最も効果的な方法は何ですか?

  719  101


ベストアンサー

import shutil

shutil.rmtree('/folder_name')

設計上、 `rmtree`は読み取り専用ファイルを含むフォルダツリーでは失敗します。 読み取り専用ファイルが含まれているかどうかに関係なく、フォルダを削除する場合は、次のコマンドを使用します。

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

1,150


http://docs.python.org/library/os.html#os.walk [the python docs]から 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))

123


shutil shutil.rmtreeのインポート(dest、ignore_errors = True)

99


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

ここで pth`は pathlib.Path`インスタンスです。 いいですが、最速ではないかもしれません。

15


インポートosインポート統計インポートshutil

def errorRemoveReadonly(func、path、exc):(os.rmdir、os.remove)およびexcvalue.errno == errno.EACCESの場合、excvalue = exc [1]:#ファイルを読み取り可能、書き込み可能、​​実行可能に変更します。 0777 os.chmod(path、stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)#func(path)を再試行してください。

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の場合、例外が発生します。ここにコードを入力してください

7


dirツリー全体を削除し、dirの内容にこれ以上関心がないことが確実であれば、dirツリー全体をクロールするのは愚かです…​ それをするには、pythonからネイティブのOSコマンドを呼び出すだけです。 それはより速く、効率的で、そしてメモリ消費量が少なくなるでしょう。

RMDIR c:\ blah / s / q

または* nix

rm -rf / home / whatever

Pythonでは、コードは..のようになります。

import sysインポートos

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

def getstatusoutput(cmd): "" "シェルでcmdを実行した場合の戻り値(ステータス、出力)" "mswindows以外の場合:" "return commands.getstatusoutput(cmd)pipe = os.popen(cmd '2>

def deleteDir(path):mswindows:cmd = "RMDIR" path "/ s / q"の場合、 "" "パス全体を削除します。else:cmd =" rm -rf "path result = getstatusoutput(cmd)if(result) [0]!= 0):RuntimeErrorを送出する(結果[1])

5


上記の答えを完成させるためのいくつかのpython 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")

フォルダのサイズが400 KB未満の場合は、フォルダを削除します。

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

5


__
この例は、ファイルの一部に読み取り専用ビットが設定されている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)

__

5


kkubasikの答えに基づいて、削除する前にフォルダが存在するかどうかをチェックし、より堅牢に

import shutil def remove_folder(path):#os.path.exists(path)が存在する場合はフォルダが存在するか確認します。#存在する場合は削除shutil.rmtree(path)は存在しません。 ")remove_folder(" / folder_name ")

4


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

3


タイトルとURLをコピーしました