删除 X 天以前的文件夹中的所有文件

我正在尝试编写一个 Python 脚本来删除 X 天以前的文件夹中的所有文件。以下是我目前掌握的情况:

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,

它给出了文件名,我做错了什么?

126523 次浏览

你也需要给它的路径,否则它将在 cwd 中寻找。.讽刺的是,你在 os.remove上就这么做了,除此之外没有别的地方..。

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

os.listdir()返回一个裸文件名列表。它们没有完整的路径,因此需要将其与包含目录的路径组合在一起。您在删除文件时正在这样做,但是在 stat文件时(或者在 isfile()文件时)没有这样做。

最简单的解决方法就是在循环的顶部执行一次:

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

现在 f是文件的完整路径,您只需在任何地方使用 f(将 remove()调用更改为也只使用 f)。

一个简单的 python 脚本,可以删除超过10天的/log/files

#!/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__,您可以用您的路径替换。

我想补充一下我想出来怎么做这个任务。 在登录过程中调用该函数。

    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)

我认为新的 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 使得列出目录内容、访问文件特征(如创建时间)和获取完整路径变得非常容易。
  • Arrow 使计算次数变得更容易、更简洁。

下面的输出显示了 Pathlib提供的完整路径(不需要加入)

C:\scratch\removeThem\four.txt
C:\scratch\removeThem\one.txt
C:\scratch\removeThem\three.txt
C:\scratch\removeThem\two.txt

这会删除超过60天的文件。

import os


directory = '/home/coffee/Documents'


os.system("find " + directory + " -mtime +60 -print")
os.system("find " + directory + " -mtime +60 -delete")

您需要使用 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))


带有理解,可以是:

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.move (file)删除文件
  • 中的所有文件循环到 path = for file
  • 生成所有文件 = (os.path.join (path,file) for path,_, Walk (p)中的 file for file in files)
  • P 是文件系统的目录
  • 校验 mtime to match = if os.stat (file) . st _ mtime < time ()-7 * 86400

可见: https://ideone.com/Bryj1l

我用更充分的方式做到了

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)

下面是我在 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!")

其他一些答案也有相同的代码,但我觉得他们过于复杂的一个非常简单的过程

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")

我可能有点晚了,但这是我使用 pathlib 的时间戳将 date 对象转换为 float 并将其与 file.stat ()进行比较的方法。时间

from pathlib import Path
import datetime as dt
from time import ctime




remove_before = dt.datetime.now()-dt.timedelta(days=10) files older than 10 days


removeMe = Path.home() / 'downloads' # points to :\users\%myusername%\
for file in removeMe.iterdir():
if remove_before.timestamp() > file.stat().st_mtime:
print(ctime(file.stat().st_mtime))
file.unlink() # to delete the file