我是python的新手,我需要获取所有第一级子目录的列表,这些子目录按我可以抓取的最后访问日期反向排序。 关键是我正在编写一个清理函数,它接收一个包含要释放的兆字节数量的变量。然后,它应遍历所有第一级子目录,并根据其上次访问日期列出它们。然后该函数应该开始删除它们,直到释放所需的兆字节数量为止。
到目前为止我的代码:
import os
def cleanSpace(megs,path="/var/lib/mpd/music/"):
list = []
for root, dir, file in os.walk(path):
this_path = os.path.join(root, dir)
stat = os.stat(this_path)
this_atime = stat.st_atime
this_size = round(stat.st_size/1048576)
list.append([this_path,this_atime,this_size])
sort(list, key=lambda x: x[1], reverse=True)
total_freed = 0
for folder in list:
if total_freed < megs:
#os.unlink(folder[0])
print(folder[0])
total_freed += folder[2]
else:
print("Total freed space:",total_freed)
break
答案 0 :(得分:2)
我可以立即看到2个错误:
for root, dir, file in os.walk(path):
this_path = os.path.join(root, dir)
dir
是list
,所以您可能意味着:
for root, dir, file in os.walk(path):
for item in dir:
this_path = os.path.join(root, item)
但请注意,os.walk
将向下钻取&#39;进入所有子目录 - 如果你想将子目录放在顶层,你可能意味着:
for item in os.listdir(path):
if os.path.isdir(item):
没有名为sort
的内置方法 - 您的意思是sorted
(或sort
在别处定义了吗?)
(另据我的评论,dir
,list
和file
是内置的,您应该重写,因此您应该选择其他变量名称。
答案 1 :(得分:0)
谢谢大家!
一个小问题。在我的Windows机器上,os.path.getsize将报告错误的数字。
更新:见下文
以下是最终代码:
import os
import datetime
def get_size(start_path = '.'):
total_size = 0
for dirpath, dirnames, filenames in os.walk(start_path):
for f in filenames:
fp = os.path.join(dirpath, f)
total_size += os.path.getsize(fp)
return total_size
def cleanSpace(megs,path="c:/Users/i/Downloads/"):
list = []
for item in os.listdir(path):
fullitem=os.path.join(path, item)
if os.path.isdir(fullitem):
this_path = fullitem
stat = os.stat(fullitem)
this_atime = stat.st_atime
#print("Last access: ",this_atime)
#print("Last access: ",datetime.datetime.fromtimestamp(this_atime))
this_size = get_size(fullitem)
#size in MB
this_size = round(this_size/1048576)
list.append([fullitem,this_atime,this_size])
list = sorted(list, key=lambda x: x[1], reverse=False)
total_freed = 0
for folder in list:
if total_freed < megs:
#os.unlink(folder[0])
print(folder[0] + " - size: " + str(folder[2]))
total_freed = total_freed + folder[2]
else:
print("Total freed space (MB):",total_freed)
break
if total_freed < megs:
print("Not enough space freed")
cleanSpace(1100,)
对于文件夹尺寸我现在使用Calculating a directory's size using Python?中的函数get_size()