2016-06-15 3 views
-2

Stack Overflowで次のPythonスクリプトが見つかりました。サブフォルダやファイルも削除するという再帰的な意味が必要であることを除いて、問題なく動作させることができます。どうやってやるの? os.walk(path)代わりのos.listdir(path)を使用してpythonを再帰的にスクリプトを削除するには?

#Import the required Python modules 
import os 
import time 
import sys 

#Set the folder path for deletion 
path = r"c:\Delete" 

#Set the time variable for "now" to subtract 30 days from "now." 
now = time.time() 

#Loop through the files in the path and delete any older than 30 days! 
for f in os.listdir(path): 
    f = os.path.join(path, f) 
    if os.stat(f).st_mtime < now - 30 * 86400: 
      if os.path.isfile(f): 
       os.remove(os.path.join(path, f)) 
+0

ようこそスタックオーバーフロー。タイトルに* recursive *という用語を使用しているので、あなたが投稿したトップレベルのコードを再帰的に使うことはできません。だから、私はそれに応じてそのコードをリファクタリングしてから、結果の関数に再帰を適用することから始めます。 –

+0

@FrédéricHamidi:再帰関数を使用せずに再帰的ロジックを適用できます。しばしば彼らは一緒に行くが、必ずしもそうではない。この場合、再帰的に行う必要があるのはディレクトリトラバーサルです。 – Blckknght

+0

@Blckknghtは、質問をどのように解釈するかによって異なります。とにかく、質問者はいずれかの方法で試してみる前にどのような再帰があるかを理解しなければなりません。 –

答えて

0

は再帰的に同じことを行うが、します。それを試してください。

そしてもちろん、あなたは私がにリンクされているセクションの最後の例を参照して、サブフォルダ内のファイルのフルパスを取得する必要があります:

rootは、3-内の最初の要素である
os.path.join(root, name) 

タプルはos.walk()から返され、nameが3番目のタプルです。

EDIT:全例ここでは、(リンク先のページから撮影):

# Delete everything reachable from the directory named in "top", 
# assuming there are no symbolic links. 
# CAUTION: This is dangerous! For example, if top == '/', it 
# could delete all your disk files. 
import os 
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)) 

はちょうどあなたの時間フィルタリングを追加し、私はそれが動作するはずだと思います。

+0

それはトリックでした!ありがとう@ ToVine! – toolfan2k4

+0

@ toolfan2k4この回答が最も受け入れやすいと思われる場合は、そのようにマークしてください。 – Ouroborus

+0

@Ouroborus - 私は試しましたが、StackOverflowを初めて使ったので、評判が15に達するまで表示されません。これは素晴らしいフォーラムですが、いくつかのルールは生産性が低いようです。例えば、私が新しいから、コードを借りた以前の投稿についてはコメントできませんでした。これは、必要がないときに新しいトピックを作成するように強制しました。私は評判システムの使用を理解していますが、確かに欠点があります。 – toolfan2k4

関連する問題