Python:列出按上次访问日期排序的一级子目录

时间:2018-02-10 11:59:00

标签: python

我是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

2 个答案:

答案 0 :(得分:2)

我可以立即看到2个错误:

for root, dir, file in os.walk(path):
    this_path = os.path.join(root, dir)

dirlist,所以您可能意味着:

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在别处定义了吗?)

(另据我的评论,dirlistfile是内置的,您应该重写,因此您应该选择其他变量名称。

答案 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()