web-dev-qa-db-ja.com

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

特定のディレクトリ内のすべてのファイルを削除しようとすると、次のエラーが発生します。

OSError: [Errno 2] No such file or directory: '/home/me/test/*'

私が実行しているコードは次のとおりです。

import os
test = "/home/me/test/*"
os.remove(test)
40
Kelvin

os.remove()はディレクトリでは機能せず、os.rmdir()は空のディレクトリでのみ機能します。また、Pythonは、一部のシェルのように「/ home/me/test/*」を自動的に展開しません。

ただし、ディレクトリでshutil.rmtree()を使用してこれを行うことができます。

import shutil
shutil.rmtree('/home/me/test') 

ファイルも削除されるので注意してくださいおよびサブディレクトリも同様です。

56
Jacob Mattison

os.removeは、UNIXスタイルのパターンを解決しません。 UNIXのようなシステムを使用している場合、次のことができます。

os.system('rm '+test)

それ以外の場合:

import glob, os
test = '/path/*'
r = glob.glob(test)
for i in r:
   os.remove(i)
16
basaundi

*はシェル構造であるため。 Pythonはディレクトリ/ home/me/testで「*」という名前のファイルを文字通り探しています。listdirを使用して最初にファイルのリストを取得し、次に各ファイルでremoveを呼び出します。

7
mamboking

これは古い質問ですが、このアプローチを使用してまだ誰も回答していないと思います。

# python 2.7
import os

d='/home/me/test'
filesToRemove = [os.path.join(d,f) for f in os.listdir(d)]
for f in filesToRemove:
    os.remove(f) 
4
user3281700

starはUnix Shellによって展開されます。呼び出しはシェルにアクセスしていません。名前がスターで終わるファイルを削除しようとしているだけです

3
DVK

ちょっとしたハックですが、ディレクトリを保持したい場合は、以下を使用できます。

import os
import shutil
shutil.rmtree('/home/me/test') 
os.mkdir('/home/me/test')
1
Prajwel

これにより、ディレクトリ内のすべてのファイルが取得され、削除されます。

import os

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
dir = os.path.join(BASE_DIR, "foldername")

for root, dirs, files in os.walk(dir):
  for file in files:
    path = os.path.join(dir, file)
    os.remove(path)
1
Osman ali Khan

私がこれをやった別の方法:

os.popen('rm -f ./yourdir')
1
Alex

ほとんどの場合、shutil.rmtree()。ただし、Windowsでは読み取り専用ファイルでは機能しません。 Windowsの場合、PyWin32からwin32apiおよびwin32conモジュールをインポートします。

def rmtree(dirname):
    retry = True
    while retry:
        retry = False
        try:
            shutil.rmtree(dirname)
        except exceptions.WindowsError, e:
            if e.winerror == 5: # No write permission
                win32api.SetFileAttributes(dirname, win32con.FILE_ATTRIBUTE_NORMAL)
                retry = True
1
zinovii

ここで私の答えをご覧ください:

https://stackoverflow.com/a/24844618/2293304

長くてandいですが、信頼性が高く効率的なソリューションです。

他の回答者が対処していないいくつかの問題を解決します。

  • シンボリックリンクでshutil.rmtree()を呼び出さないなど、シンボリックリンクを正しく処理します(ディレクトリにリンクする場合、os.path.isdir()テストに合格します)。
  • 読み取り専用ファイルを適切に処理します。
0
Rockallite
#python 2.7
import tempfile
import shutil
import exceptions
import os

def TempCleaner():
    temp_dir_name = tempfile.gettempdir()
    for currentdir in os.listdir(temp_dir_name):
        try:
           shutil.rmtree(os.path.join(temp_dir_name, currentdir))
        except exceptions.WindowsError, e:
            print u'Не удалось удалить:'+ e.filename
0

os.removeは、単一のファイルのみを削除します。

ワイルドカードを使用して削除するには、これを処理する独自のルーチンを作成する必要があります。

このフォーラムのページには かなりの数の提案されたアプローチ がリストされています。

0
Reed Copsey