Pythonを使用してディレクトリ内のすべてのファイルを削除する


147

.bakディレクトリ内の拡張子が付いたすべてのファイルを削除したい。Pythonではどうすればよいですか?


5
@ slh2080:「解決済み」を投稿することは、このサイトで行うことではありません。実際に使用した答えを選び、チェックマークをクリックして問題が解決したことを示します。
S.Lott

1
ごめんなさい。私の間違いを指摘してくれてありがとう。宿題ではなく、暇なときにpythonを学ぶだけです。私は使用した答えをクリックしましたが、それはghostdog74の応答が表示される前でした。
slh2080

注:ディレクトリツリー全体を削除するには、をshutil.rmtree(path)使用できます
jfs 2015

回答:


270

経由os.listdiros.remove

import os

filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ]
for f in filelist:
    os.remove(os.path.join(mydir, f))

またはglob.glob

import glob, os, os.path

filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
    os.remove(f)

最終的にはを使用して、必ず正しいディレクトリに移動してくださいos.chdir


21
最初の例は冗長なforループの使用です。-[os.remove(f)for f in os.listdir( "。")if f.endswith( "。bak")]-リスト内包表記を使用するためのものです。または、内包の「if」をforループに移動できます-for f in os.listdir( "。"):if f.endswith( "。bak"):os.remove(f)
dragonjujo

@ slh2080問題が解決したと言ったので、正解としてマークしてみませんか?
blwy10

5
os.listdir( "。")に注意してください!!! 私はこのコードを使用し、パスを変更するのを忘れて、すべてのコードが消えてしまいました!!! 回復するために2つの異なるユーティリティを試したが、運が悪かった!!
Lei Guo

@LeiGuo修正しました。
yugr 2017年

26

os.chdirディレクトリを変更するために使用します。glob.glob「.bak」で終わるファイル名のリストを生成するために使用します。リストの要素は単なる文字列です。

その後、あなたは使うことができます os.unlink、ファイルを削除するためにます。(PS。os.unlinkos.removeは同じ機能の同義語です。)

#!/usr/bin/env python
import glob
import os
directory='/path/to/dir'
os.chdir(directory)
files=glob.glob('*.bak')
for filename in files:
    os.unlink(filename)

18

Python 3.5では、os.scandirファイルの属性またはタイプを確認する必要がある場合に適していますos.DirEntry。関数によって返されるオブジェクトのプロパティを参照してください。

import os 

for file in os.scandir(path):
    if file.name.endswith(".bak"):
        os.unlink(file.path)

また、それぞれにDirEntryすでにファイルへのフルパスが含まれているため、ディレクトリを変更する必要はありません。


コロンがないため、forループの最初の行は次のようになりますif file.name.endswith(".bak"):
TSeymour

ありがとう!実際に実行せずにコードを書くことを教えてくれます
Yi Jiang

8

関数を作成できます。サブディレクトリをトラバースする場合は、maxdepthを追加します。

def findNremove(path,pattern,maxdepth=1):
    cpath=path.count(os.sep)
    for r,d,f in os.walk(path):
        if r.count(os.sep) - cpath <maxdepth:
            for files in f:
                if files.endswith(pattern):
                    try:
                        print "Removing %s" % (os.path.join(r,files))
                        #os.remove(os.path.join(r,files))
                    except Exception,e:
                        print e
                    else:
                        print "%s removed" % (os.path.join(r,files))

path=os.path.join("/home","dir1","dir2")
findNremove(path,".bak")


1

LinuxおよびmacOSでは、シェルに対して単純なコマンドを実行できます。

subprocess.run('rm /tmp/*.bak', shell=True)

3
私の意見では良い選択ではありません。これは移植性がなく、追加のサブプロセスのためにおそらくより高価になります。Python APIを使用する方が良い。
Haakon

0

これは古いことに気づきました。ただし、これはosモジュールだけを使用して行う方法です...

def purgedir(parent):
    for root, dirs, files in os.walk(parent):                                      
        for item in files:
            # Delete subordinate files                                                 
            filespec = os.path.join(root, item)
            if filespec.endswith('.bak'):
                os.unlink(filespec)
        for item in dirs:
            # Recursively perform this operation for subordinate directories   
            purgedir(os.path.join(root, item))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.