web-dev-qa-db-ja.com

Pythonでフォルダの内容を削除する方法

Pythonのローカルフォルダの内容を削除するにはどうすればいいですか?

現在のプロジェクトはWindows用ですが、* nixも見たいです。

369
UnkwnTech

ファイルのみを削除し、コメントに示されているos.path.join()メソッドを使用するように更新しました。サブディレクトリも削除したい場合は、Elifステートメントのコメントを外します。

import os, shutil
folder = '/path/to/folder'
for the_file in os.listdir(folder):
    file_path = os.path.join(folder, the_file)
    try:
        if os.path.isfile(file_path):
            os.unlink(file_path)
        #Elif os.path.isdir(file_path): shutil.rmtree(file_path)
    except Exception as e:
        print(e)
343
Nick Stinemates

Shutilモジュールを試す

import shutil
shutil.rmtree('/path/to/folder')

説明:shutil.rmtree(path, ignore_errors=False, onerror=None)

Docstring:ディレクトリツリーを再帰的に削除します。

ignore_errorsが設定されている場合、エラーは無視されます。それ以外の場合、onerrorが設定されていると、引数(func, path, exc_info)でエラーを処理するために呼び出されます。ここで、funcos.listdiros.remove、またはos.rmdirです; pathは、失敗の原因となったその関数の引数です。 exc_infoは、sys.exc_info()によって返されるタプルです。 ignore_errorsがfalseでonerrorNoneの場合、例外が発生します。

重要な注意:shutil.rmtree()はターゲットフォルダーの内容を削除するだけではないことに注意してください。フォルダー自体も削除します。

210
Oli

これを簡単に実行できます。

import os
import glob

files = glob.glob('/YOUR/PATH/*')
for f in files:
    os.remove(f)

もちろん、あなたのパスに他のフィルタを使うこともできます。

184
Blueicefield

Mhawkeの答えを拡張して、これが私が実装したものです。フォルダの内容はすべて削除されますが、フォルダ自体は削除されません。ファイル、フォルダ、およびシンボリックリンクを使ってLinuxでテストした場合は、Windowsでも動作するはずです。

import os
import shutil

for root, dirs, files in os.walk('/path/to/folder'):
    for f in files:
        os.unlink(os.path.join(root, f))
    for d in dirs:
        shutil.rmtree(os.path.join(root, d))
69
Iker Jimenez

rmtreeを使用してフォルダを再作成することはできますが、ネットワークドライブ上のフォルダを削除してすぐに再作成するとエラーが発生します。

Walkを使用する提案された解決策は、フォルダを削除するためにrmtreeを使用し、その後それらのフォルダ内にあったファイルにos.unlinkを使用しようと試みるかもしれないのでうまくいきません。これによりエラーが発生します。

投稿されたglobソリューションも空でないフォルダを削除しようとし、エラーを引き起こします。

私はあなたが使うことを勧めます:

folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
    file_object_path = os.path.join(folder_path, file_object)
    if os.path.isfile(file_object_path):
        os.unlink(file_object_path)
    else:
        shutil.rmtree(file_object_path)
44
jgoeders

Onelinerとして:

import os

# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )

# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )

ファイルとディレクトリを考慮した、より堅牢なソリューションは、(2.7)です。

def rm(f):
    if os.path.isdir(f): return os.rmdir(f)
    if os.path.isfile(f): return os.unlink(f)
    raise TypeError, 'must be either file or directory'

map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
15
fmonegaglia

これがこれまでのところ唯一の答えです。

  • すべてのシンボリックリンクを削除する
    • デッドリンク
    • ディレクトリへのリンク
    • ファイルへのリンク
  • サブディレクトリを削除します
  • 親ディレクトリを削除しません

コード:

for filename in os.listdir(dirpath):
    filepath = os.path.join(dirpath, filename)
    try:
        shutil.rmtree(filepath)
    except OSError:
        os.remove(filepath)

他の多くの答えと同様に、これはファイル/ディレクトリの削除を可能にするためにパーミッションを調整することを試みません。

15
Jon Chu

注:誰かが私の答えに賛成票を投じた場合に備えて、ここで説明することがあります。

  1. 誰もが短い 'n'簡単な答えを好む。しかし、時には現実はそれほど単純ではありません。
  2. 私の答えに戻る。私はshutil.rmtree()がディレクトリツリーを削除するために使われることができることを知っています。私は自分のプロジェクトでそれを何度も使用しました。しかし、ディレクトリ自体もshutil.rmtree()によって削除されることに気付かなければなりません。これは一部のユーザーには受け入れられるかもしれませんが、(副作用なしで)フォルダーの内容を削除するための有効な答えではありません
  3. 副作用の例を紹介します。 カスタマイズされた所有者ビットとモードビットを持つディレクトリがあるとします。そこにはたくさんの内容があります。それからshutil.rmtree()でそれを削除し、os.mkdir()でそれを再構築します。そして、デフォルトの(継承された)所有者とモードのビットを持つ空のディレクトリを得るでしょう。あなたはその内容とディレクトリさえも削除する特権を持っているかもしれませんが、あなたはそのディレクトリの元の所有者とモードビットを戻すことができないかもしれません(例えばあなたはスーパーユーザではありません)。
  4. 最後に、辛抱してコードを読んでください。それは長くて見苦しいですが(使用中)信頼性が高く効率的であることが証明されています。

これは長くて醜いですが、信頼性があり効率的な解決策です。

他の回答者によって解決されていないいくつかの問題を解決します。

  • シンボリックリンク上でshutil.rmtree()を呼び出さないこと(ディレクトリにリンクする場合はos.path.isdir()テストに合格します。os.walk()の結果にもシンボリックリンクされたディレクトリが含まれる場合も含む)を含め、シンボリックリンクを正しく処理します。
  • 読み取り専用ファイルをうまく処理します。

これがコードです(唯一の便利な関数はclear_dir()です)。

import os
import stat
import shutil


# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
    # Handle read-only files and directories
    if fn is os.rmdir:
        os.chmod(path_, stat.S_IWRITE)
        os.rmdir(path_)
    Elif fn is os.remove:
        os.lchmod(path_, stat.S_IWRITE)
        os.remove(path_)


def force_remove_file_or_symlink(path_):
    try:
        os.remove(path_)
    except OSError:
        os.lchmod(path_, stat.S_IWRITE)
        os.remove(path_)


# Code from shutil.rmtree()
def is_regular_dir(path_):
    try:
        mode = os.lstat(path_).st_mode
    except os.error:
        mode = 0
    return stat.S_ISDIR(mode)


def clear_dir(path_):
    if is_regular_dir(path_):
        # Given path is a directory, clear its content
        for name in os.listdir(path_):
            fullpath = os.path.join(path_, name)
            if is_regular_dir(fullpath):
                shutil.rmtree(fullpath, onerror=_remove_readonly)
            else:
                force_remove_file_or_symlink(fullpath)
    else:
        # Given path is a file or a symlink.
        # Raise an exception here to avoid accidentally clearing the content
        # of a symbolic linked directory.
        raise OSError("Cannot call clear_dir() on a symbolic link")
14
Rockallite
import os
import shutil

# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]

# Iterate and remove each item in the appropriate manner
[os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]

以前のコメントでは、Python 3.5以降でos.scandirを使用することについても言及していました。例えば:

import os
import shutil

with os.scandir(target_dir) as entries:
    for entry in entries:
        if entry.is_file() or entry.is_symlink():
            os.remove(entry.path)
        Elif entry.is_dir():
            shutil.rmtree(entry.path)
10
Jacob Wan

これにはos.walk()を使うほうがよいかもしれません。

os.listdir()はファイルをディレクトリと区別しないので、これらのリンクを解除しようとするとすぐに問題に陥るでしょう。ここでos.walk()を使ってディレクトリを再帰的に削除する 良い例があります 。そしてあなたの状況にどう適応するかについてのヒントがあります。

8
mhawke

私はこのようにして問題を解決していました:

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)
8
ProfHase85

私はそれが古いスレッドだと知っていますが、私はpythonの公式サイトから何か面白いものを見つけました。ディレクトリ内のすべてのコンテンツを削除するための別のアイデアを共有するためだけに使用します。 shutil.rmtree()を使用するときに認証の問題がいくつかあり、ディレクトリを削除して再作成したくないためです。元のアドレスは http://docs.python.org/2/library/os.html#os.walk です。誰かに役立つことを願っています。

def emptydir(top):
    if(top == '/' or top == "\\"): return
    else:
        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))
6
Sawyer

もう一つの解決策:

import sh
sh.rm(sh.glob('/path/to/folder/*'))
5
Robin Winslow

かなり直感的な方法:

import shutil, os


def remove_folder_contents(path):
    shutil.rmtree(path)
    os.makedirs(path)


remove_folder_contents('/path/to/folder')
4
Manrique

あなたが* nixシステムを使っているなら、なぜシステムコマンドを利用しないのですか?

import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
3
silverbullettt

以下の間にtime.sleep()を追加することでrmtreemakedirsの問題を解決しました。

if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)

time.sleep(.5)

os.makedirs(folder_location, 0o777)
2
physlexic

私はこの仕事をするための素晴らしいpathlibについて誰も言及していません。

ディレクトリ内のファイルを削除したいだけなら、それは面倒なことになるでしょう

from pathlib import Path

[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()] 

ディレクトリを再帰的に削除するには、次のように書くことができます。

from pathlib import Path
from shutil import rmtree

for path in Path("/path/to/folder").glob("**/*"):
    if path.is_file():
        path.unlink()
    Elif path.is_dir():
        rmtree(path)
1
Husky

単にこれをしてください。これはディレクトリ内だけでなくサブディレクトリからもすべてのファイルを削除します。フォルダ/ディレクトリに害を与えることなく。 Ubuntuでは問題なく動作します。

import os, re, os.path
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
    for file in files:
        os.remove(os.path.join(root, file))
0
Kevin Patel

限られた、特定の状況に対する答え:サブフォルダツリーを維持している間にファイルを削除したいと思うなら、再帰的なアルゴリズムを使うことができます:

import os

def recursively_remove_files(f):
    if os.path.isfile(f):
        os.unlink(f)
    Elif os.path.isdir(f):
        map(recursively_remove_files, [os.path.join(f,fi) for fi in os.listdir(f)])

recursively_remove_files(my_directory)

ちょっと話題が違うかもしれませんが、私は多くの人が役に立つと思うでしょう

0
fmonegaglia

フォルダ内のすべてのファイルを削除する/すべてのファイルを削除する最も簡単な方法

import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)
0
PyBoss

temp_dirを削除すると仮定すると、osを使用した単一行コマンドは次のようになります。

_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]

注:これはファイルを削除するための1行のみです 'ディレクトリを削除しません。

お役に立てれば。ありがとう。

0
End-2-End

以下のメソッドを使用して、ディレクトリ自体ではなく、ディレクトリの内容を削除します。

import os
import shutil

def remove_contents(path):
    for c in os.listdir(path):
        full_path = os.path.join(path, c)
        if os.path.isfile(full_path):
            os.remove(full_path)
        else:
            shutil.rmtree(full_path)
0
Amir Rezazadeh