web-dev-qa-db-ja.com

python内のフォルダーを再帰的に削除する

空のディレクトリを削除すると問題が発生します。ここに私のコードがあります:

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'

どこで間違いを犯していますか?

156
sriram

shutil.rmtree を試してください:

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

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

25
lqs

shutil でrmtreeを試してください。 python stdライブラリ

12
microo8

ショーに少し遅れましたが、ここに私の純粋な Pathlib 再帰的なディレクトリアンリンカーがあります

def rmdir(dir):
    dir = Path(dir)
    for item in dir.iterdir():
        if item.is_dir():
            rmdir(item)
        else:
            item.unlink()
    dir.rmdir()

rmdir(pathlib.Path("dir/"))
7
mitch

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

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

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
Justus Wingert

コマンド(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
Monir

再帰的な解決策は次のとおりです。

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)
0
Tobias Ernst

別のpure-pathlibソリューションですが、without再帰です:

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()
0
pepoluan