Pythonでフォルダーを再帰的に削除する


203

空のディレクトリの削除に問題があります。これが私のコードです:

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

上記のフォルダはすべて空であることに注意してください。私は、フォルダにこのスクリプトを実行すると2025一人で削除されます!しかし、フォルダ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
彼らが隠しファイルを持っていないことを確信していますか?
ジェフ

例外またはトレースバックは印刷されますか?もしそうなら-あなたが質問にそれを追加した場合それは助けになるでしょう
Ngure Nyaga

@ジェフ:はい、きっと。実際、私のubuntuマシンでrmdir /path/to/25th/folderは、ディレクトリ全体を削除しようとしました。つまり、そのディレクトリは空のディレクトリです。
スリラム

回答:


392

試してくださいshutil.rmtree

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

5
rmtreeディレクトリ全体を削除しましたか?それはそれに似ていると思いますrm -Rf $DIR
スリラム

7
rmtreeもファイルを削除するので注意してください。尋ねたとして、質問はほぼ正確にこの質問と一致していることをos.walkギブ例えばEMPTY directories.Theのドキュメントを削除する方法だった: import os for root, dirs, files in os.walk(top, topdown=False): for name in dirs: os.rmdir(os.path.join(root, name))
DaveSawyer

Python3バージョンドキュメント:docs.python.org/3/library/shutil.html#shutil.rmtree
Vladimir

27

のデフォルトの動作はos.walk()、ルートからリーフまで歩くことです。設定するtopdown=Falseにはos.walk()ルートに葉から歩いて。


18

これが私の純粋なpathlib再帰ディレクトリunlinkerです:

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()shutilPythonの標準ライブラリから


1
rmtreeディレクトリ全体を削除しましたか?それはそれに似ていると思いますrm -Rf $DIR
スリラム

2
ドキュメントから:「ディレクトリツリー全体を削除します。パスはディレクトリを指す必要があります(ただし、ディレクトリへのシンボリックリンクは指していません)。ignore_errorsがtrueの場合、削除の失敗によるエラーは無視されます。falseまたは省略された場合、そのようなエラーは処理されますonerrorで指定されたハンドラを呼び出すか、それが省略されている場合は、例外が発生します。」
microo8 2012年

7

from shutil import rmtree これは大きなパッケージであるため、絶対パスを使用してrmtree関数のみをインポートすることをお勧めし ます。上記の行は必要な関数のみをインポートします。

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

1
次に、これをとして参照しrmtree()ます。不可shutil.rmtree()
ケビンマーフィー、

4

micropythonソリューションを探している次の人のために、これは純粋にos(listdir、remove、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
statモジュールは、os.stat()、os.fstat()およびos.lstat()の結果を解釈するための定数と関数を定義します。何を試すことができます:STAT輸入から輸入OS、SYS *
Monir

0

これが別のpure-pathlibソリューションですが再帰はありませ

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

Linuxユーザーの場合は、Pythonコマンドでシェルコマンドを実行するだけです。

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

どこrmの略で除去し、-rために再帰的に

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.