如何在 python 中定期清理工作目录中的文件
How to regularly clean up files in a working directory in python
我有一个 python 脚本可以将一些信息缓存到文件中。如果存在,该文件将被重用。否则脚本会调用一些其他函数,这需要很长时间才能生成这样的文件。文件名有一定的模式,它们都存储在一个$WORKING_DIRECTORY
中
def dummy(param):
fname = "file"+params
if fname exists in $WORKING_DIR:
reuse file
else:
long_time_process(param)
create file in $WORKING_DIR
由于这个虚拟函数会被多次调用,参数不同,所以会生成很多文件。我想保持目录大小适中,文件中的信息相对最新。所以我想为目录的大小设置一个阈值。一旦达到限制,我将删除最旧的文件,直到目录大小减少到 THRESHOLD 的一半。
我目前的解决方案是:
def dummy(param):
purge($WORKING_DIR)
...#Rest of dummy logic
def purge(dir):
if get_size(dir) > THRESHOLD:
while get_size(dir) > THRESHOLD/2:
remove oldest file
def get_size(dir):
size = 0
for file in dir:
size = size + file.size()
return size
这确实有效,但大多数时候调用清除是不必要的,因为它只会在一千次调用后达到阈值一次。最重要的是,如果文件数量巨大,目录 get_size 也可能很耗时。
所以问题是如何优化 get_size 并将清除逻辑与我当前的虚拟函数集成?有什么好的 pythonic 方法吗?或者我可以使用的模式?谢谢
您可以使用全局变量来记录函数被调用的次数
global count
def dummy(param):
count +=1
if count > THRESHOLD:
purge($WORKING_DIR)
...#Rest of dummy logic
def purge(dir):
while count > THRESHOLD/2:
remove oldest file
count-=1
def get_size(dir):
size = 0
for file in dir:
size = size + file.size()
return size
我最终使用文件数量作为清除指标,并为 puger 级别设置了明确的目标。我按上次访问时间对文件进行了排序,并删除了 [target:] 范围内的文件以避免频繁的 get_size 操作。
我的清除逻辑的框架如下。
我可以通过这种方式清除,因为我的文件通常很小,文件数量是总大小的一个很好的指标。
def purge(dir, filepattern):
files = glob.glob(os.path.join(directory, filepattern))
files_count=len(files)
if files_count > THRESHOLD:
files.sort(key=lambda f: os.path.getatime(f), reverse=True)
for f in files[TARGET:]:
os.remove(f)
我有一个 python 脚本可以将一些信息缓存到文件中。如果存在,该文件将被重用。否则脚本会调用一些其他函数,这需要很长时间才能生成这样的文件。文件名有一定的模式,它们都存储在一个$WORKING_DIRECTORY
中def dummy(param):
fname = "file"+params
if fname exists in $WORKING_DIR:
reuse file
else:
long_time_process(param)
create file in $WORKING_DIR
由于这个虚拟函数会被多次调用,参数不同,所以会生成很多文件。我想保持目录大小适中,文件中的信息相对最新。所以我想为目录的大小设置一个阈值。一旦达到限制,我将删除最旧的文件,直到目录大小减少到 THRESHOLD 的一半。
我目前的解决方案是:
def dummy(param):
purge($WORKING_DIR)
...#Rest of dummy logic
def purge(dir):
if get_size(dir) > THRESHOLD:
while get_size(dir) > THRESHOLD/2:
remove oldest file
def get_size(dir):
size = 0
for file in dir:
size = size + file.size()
return size
这确实有效,但大多数时候调用清除是不必要的,因为它只会在一千次调用后达到阈值一次。最重要的是,如果文件数量巨大,目录 get_size 也可能很耗时。
所以问题是如何优化 get_size 并将清除逻辑与我当前的虚拟函数集成?有什么好的 pythonic 方法吗?或者我可以使用的模式?谢谢
您可以使用全局变量来记录函数被调用的次数
global count
def dummy(param):
count +=1
if count > THRESHOLD:
purge($WORKING_DIR)
...#Rest of dummy logic
def purge(dir):
while count > THRESHOLD/2:
remove oldest file
count-=1
def get_size(dir):
size = 0
for file in dir:
size = size + file.size()
return size
我最终使用文件数量作为清除指标,并为 puger 级别设置了明确的目标。我按上次访问时间对文件进行了排序,并删除了 [target:] 范围内的文件以避免频繁的 get_size 操作。
我的清除逻辑的框架如下。 我可以通过这种方式清除,因为我的文件通常很小,文件数量是总大小的一个很好的指标。
def purge(dir, filepattern):
files = glob.glob(os.path.join(directory, filepattern))
files_count=len(files)
if files_count > THRESHOLD:
files.sort(key=lambda f: os.path.getatime(f), reverse=True)
for f in files[TARGET:]:
os.remove(f)