65

X日より古いフォルダ内のすべてのファイルを削除するPythonスクリプトを作成しようとしています。これは私がこれまでに持っているものです:

import os, time, sys
    
path = r"c:\users\%myusername%\downloads"
now = time.time()

for f in os.listdir(path):
  if os.stat(f).st_mtime < now - 7 * 86400:
    if os.path.isfile(f):
      os.remove(os.path.join(path, f))

スクリプトを実行すると、次のようになります。

Error2 - system cannot find the file specified

そしてそれはファイル名を与えます。私は何が間違っているのですか?

4

11 に答える 11

31

os.listdir()ベアファイル名のリストを返します。これらにはフルパスがないため、それを含むディレクトリのパスと組み合わせる必要があります。これは、ファイルを削除するときに実行しますが、ファイルを削除するときstat(または実行するとき)には実行しませんisfile()

最も簡単な解決策は、ループの先頭で1回実行することです。

f = os.path.join(path, f)

これfがファイルへのフルパスであり、fどこでも使用できます(remove()呼び出しfも使用するように変更してください)。

于 2012-09-18T22:06:54.520 に答える
18

新しいpathlibと日付の矢印モジュールを組み合わせると、コードがすっきりします。

from pathlib import Path
import arrow

filesPath = r"C:\scratch\removeThem"

criticalTime = arrow.now().shift(hours=+5).shift(days=-7)

for item in Path(filesPath).glob('*'):
    if item.is_file():
        print (str(item.absolute()))
        itemTime = arrow.get(item.stat().st_mtime)
        if itemTime < criticalTime:
            #remove it
            pass
  • pathlibを使用すると、ディレクトリの内容を簡単に一覧表示したり、作成時間などのファイル特性にアクセスしたり、フルパスを取得したりできます。
  • 矢印を使用すると、時間の計算が簡単でわかりやすくなります。

これは、 pathlibによって提供されるフルパスを示す出力です。(参加する必要はありません。)

C:\scratch\removeThem\four.txt
C:\scratch\removeThem\one.txt
C:\scratch\removeThem\three.txt
C:\scratch\removeThem\two.txt
于 2017-01-17T19:00:41.557 に答える
14

パスも指定する必要があります。そうしないと、cwdで表示されます。皮肉なことに、これは皮肉なことにos.remove、他の場所では実行できませんでした。

for f in os.listdir(path):
    if os.stat(os.path.join(path,f)).st_mtime < now - 7 * 86400:
于 2012-09-18T22:02:52.370 に答える
5

if os.stat(os.path.join(path, f)).st_mtime < now - 7 * 86400:代わりに使用する必要がありますif os.stat(f).st_mtime < now - 7 * 86400:

私はより便利な使用を見つけますos.path.getmtime:-

import os, time

path = r"c:\users\%myusername%\downloads"
now = time.time()

for filename in os.listdir(path):
    # if os.stat(os.path.join(path, filename)).st_mtime < now - 7 * 86400:
    if os.path.getmtime(os.path.join(path, filename)) < now - 7 * 86400:
        if os.path.isfile(os.path.join(path, filename)):
            print(filename)
            os.remove(os.path.join(path, filename))

于 2019-03-01T12:10:17.943 に答える
5

私はもっ​​と十分な方法でそれをしました

import os, time

path = "/home/mansoor/Documents/clients/AirFinder/vendors"
now = time.time()

for filename in os.listdir(path):
    filestamp = os.stat(os.path.join(path, filename)).st_mtime
    filecompare = now - 7 * 86400
    if  filestamp < filecompare:
     print(filename)
于 2020-08-12T08:28:04.240 に答える
3

10日より古い/logs/ファイルを削除する簡単なPythonスクリプト

#!/usr/bin/python

# run by crontab
# removes any files in /logs/ older than 10 days

import os, sys, time
from subprocess import call

def get_file_directory(file):
    return os.path.dirname(os.path.abspath(file))

now = time.time()
cutoff = now - (10 * 86400)

files = os.listdir(os.path.join(get_file_directory(__file__), "logs"))
file_path = os.path.join(get_file_directory(__file__), "logs/")
for xfile in files:
    if os.path.isfile(str(file_path) + xfile):
        t = os.stat(str(file_path) + xfile)
        c = t.st_ctime

        # delete file if older than 10 days
        if c < cutoff:
            os.remove(str(file_path) + xfile)

あなた__file__とあなたのパスで置き換えることができます。

于 2016-04-12T08:59:59.900 に答える
1

これにより、60日より古いファイルが削除されます。

import os

directory = '/home/coffee/Documents'

os.system("find " + directory + " -mtime +60 -print")
os.system("find " + directory + " -mtime +60 -delete")
于 2018-08-31T17:33:52.887 に答える
1

理解すると、次のことができます。

import os
from time import time


p='.'
result=[os.remove(file) for file in (os.path.join(path, file) for path, _, files in os.walk(p) for file in files) if os.stat(file).st_mtime < time() - 7 * 86400]
print(result)
  • match = os.remove(file)でファイルを削除します
  • すべてのファイルをパスにループ=forfile in
  • すべてのファイルを使用した生成=(os.path.join(path、file)for path、_、files in os.walk(p)for file in files)
  • pはファイルシステムへのディレクトリです
  • mtimeが一致することを確認=ifos.stat(file).st_mtime <time()-7 * 86400

見られるかもしれません:https ://ideone.com/Bryj1l

于 2020-01-20T22:41:37.963 に答える
1

これが私のWindowsマシンでそれを行う方法です。また、shutilを使用して、ダウンロードで作成されたサブディレクトリも削除します。私は息子のコンピューターのハードドライブ上のフォルダーをクリーンアップしておくための同様のものも持っています。彼には特別なニーズがあり、物事がすぐに制御不能になる傾向があるからです。

import os, time, shutil

paths = (("C:"+os.getenv('HOMEPATH')+"\Downloads"), (os.getenv('TEMP')))
oneday = (time.time())- 1 * 86400

try:
    for path in paths:
        for filename in os.listdir(path):
            if os.path.getmtime(os.path.join(path, filename)) < oneday:
                if os.path.isfile(os.path.join(path, filename)):
                    print(filename)
                    os.remove(os.path.join(path, filename))
                elif os.path.isdir(os.path.join(path, filename)):
                    print(filename)
                    shutil.rmtree((os.path.join(path, filename)))
                    os.remove(os.path.join(path, filename))
except:
    pass
                
print("Maintenance Complete!")
于 2021-02-08T22:10:46.390 に答える
0

このタスクを実行するために私が思いついたものを追加したいと思います。この関数はログインプロセスで呼び出されます。

    def remove_files():
        removed=0
        path = "desired path"
        # Check current working directory.
        dir_to_search = os.getcwd()
        print "Current working directory %s" % dir_to_search
        #compare current to desired directory
        if dir_to_search != "full desired path":
            # Now change the directory
            os.chdir( desired path )
            # Check current working directory.
            dir_to_search = os.getcwd()
            print "Directory changed successfully %s" % dir_to_search
        for dirpath, dirnames, filenames in os.walk(dir_to_search):
           for file in filenames:
              curpath = os.path.join(dirpath, file)
              file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath))
              if datetime.datetime.now() - file_modified > datetime.timedelta(hours=1):
                  os.remove(curpath)
                  removed+=1
        print(removed)
于 2017-01-17T17:23:24.337 に答える
0

他の回答のいくつかも同じコードを持っていますが、私はそれらが非常に単純なプロセスを過度に複雑にしていると感じています

import os
import time

#folder to clear from
dir_path = 'path of directory to clean'
#No of days before which the files are to be deleted
limit_days = 10

treshold = time.time() - limit_days*86400
entries = os.listdir(dir_path)
for dir in entries:
    creation_time = os.stat(os.path.join(dir_path,dir)).st_ctime
    if creation_time < treshold:
        print(f"{dir} is created on {time.ctime(creation_time)} and will be deleted")
于 2021-04-21T14:07:55.660 に答える