我正在尝试在文件数达到阈值时删除目录中的最旧文件。
list_of_files = os.listdir('log')
if len([name for name in list_of_files]) == 25:
oldest_file = min(list_of_files, key=os.path.getctime)
os.remove('log/'+oldest_file)
问题:问题在于min方法。 list_of_files不包含完整路径,因此它尝试搜索当前目录中的文件并失败。如何将目录名称(' log')传递给min()?
答案 0 :(得分:4)
list_of_files = os.listdir('log')
full_path = ["log/{0}".format(x) for x in list_of_files]
if len([name for name in list_of_files]) == 25:
oldest_file = min(full_path, key=os.path.getctime)
os.remove(oldest_file)
答案 1 :(得分:3)
os.listdir
将返回相对路径 - 这些路径相对于您当前/现在的工作目录/执行Python脚本的上下文(您可以通过{ {1}})。
现在,os.getcwd()
函数需要一个完整路径 / 绝对路径 - shell /命令行界面推断出这个并代表你做 - 但是Python没有按'吨。您可以使用os.remove
来获取,因此您可以更改您的代码(因为os.listdir无论如何返回列表,我们不需要在其上添加list-comp以便能够检查它的长度)......:
os.path.abspath
这使得它来自何处 - 即,list_of_files = os.listdir('log')
if len(list_of_files) >= 25:
oldest_file = min(list_of_files, key=os.path.getctime)
os.remove(os.path.abspath(oldest_file))
的结果中产生的任何内容 - 您不必担心预先设置合适的文件路径。
答案 2 :(得分:1)
glob 库一方面提供完整路径并允许过滤文件模式。上述解决方案导致目录本身成为最旧的文件,这不是我想要的。对我来说,以下是合适的(glob 和@Ivan Motin 的 solution 的混合)
import glob
sorted(glob.glob("/home/pi/Pictures/*.jpg"), key=os.path.getctime)[0]
答案 3 :(得分:0)
使用理解力(抱歉,无法抗拒):
oldest_file = sorted([os.path.abspath(f) for f in os.listdir('log') ], key=os.path.getctime)[0]
答案 4 :(得分:0)
我正在尝试实现与您要实现的目标相同的目标。并且面临与os.path.abspath()
相关的类似问题
我在Windows系统上使用python 3.7
问题是os.path.abspath()
给出了一个文件夹位置
将“您的路径” 替换为文件所在的文件夹的路径,代码应该可以正常工作
import os
import time
oldest_file = sorted([ "Yourpath"+f for f in os.listdir("Yourpath")], key=os.path.getctime)[0]
print (oldest_file)
os.remove(oldest_file)
print ("{0} has been deleted".format(oldest_file))`
必须有一些更清洁的方法来执行相同操作 知道的时候我会更新