284

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

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

上記のフォルダはすべて空であることに注意してください。このスクリプトを実行すると、フォルダ20だけ25が削除されます! ただし、空のフォルダーであっても、フォルダー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'

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

4

11 に答える 11

564

試してくださいshutil.rmtree

import shutil
shutil.rmtree('/path/to/your/dir/')
于 2012-10-29T08:27:57.667 に答える
33

の既定の動作はos.walk()、ルートからリーフに移動することです。葉から根まで歩くように設定topdown=Falseします。os.walk()

于 2012-10-29T08:28:13.360 に答える
14

Python 標準ライブラリrmtree()から試すshutil

于 2012-10-29T08:29:41.730 に答える
7

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

from shutil import rmtree
rmtree('directory-absolute-path')
于 2016-07-25T09:44:36.483 に答える
5

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)
于 2018-11-04T13:02:32.210 に答える
4

コマンド (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)
于 2016-06-17T09:18:52.877 に答える
1

os.removedirs削除する単一のパスのみを探している場合、コマンドはジョブのツールです。たとえば、次のようになります。

os.removedirs("a/b/c/empty1/empty2/empty3")

を削除empty1/empty2/empty3しますが、a/b/c は残します (c には他の内容があると仮定します)。

    removedirs(name)
        removedirs(name)
        
        Super-rmdir; remove a leaf directory and all empty intermediate
        ones.  Works like rmdir except that, if the leaf directory is
        successfully removed, directories corresponding to rightmost path
        segments will be pruned away until either the whole path is
        consumed or an error occurs.  Errors during this latter phase are
        ignored -- they generally mean that a directory was not empty.
于 2021-12-02T19:14:24.887 に答える
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)
于 2019-04-07T22:37:18.730 に答える
-1

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

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

問題が発生した場合は、代わりにfrm -rを使用するとディレクトリが強制的に削除されることに注意rm -rf してください。

どこでremoverecurively、recurively + forcefullyrm表します。-r-rf

注: ディレクトリが空であるかどうかは関係ありません。ディレクトリは削除されます。

于 2020-04-18T22:07:37.887 に答える