获取目录中按添加日期排序的文件列表的最佳方法

时间:2019-05-30 07:40:19

标签: python fsutil

当最新添加的文件超出已用空间限制时,我必须删除dir中最旧的文件。我不知道为什么排序后的列表files = sorted(os.listdir(DIR), key=os.path.getctime)在第一个元素上不包含最旧的文件(在这种情况下,文件名为'file_1')

代码

    print('START: Cycle no. ', cycle)
    time.sleep(1)
    print('Saving {0} files. {1} MB each'.format(FILES_NUM, MB_FILE_SIZE))
    i = 1
    while (i < FILES_NUM):
        usage = psutil.disk_usage(DIR)
        used = usage.used // (2**20)
        # print('Uzyta pamiec: ', used)
        if (used < 50): # 50 MB
            print('Saving file_{}'.format(i))
            with open("file_{}".format(i), 'wb') as f:
                f.write(os.urandom(FILE_SIZE))           
        else:
            files = sorted(os.listdir(DIR), key=os.path.getctime)
            print('Files list: ', files)
            os.remove(files[0])
            print('Deleted oldest file: ',files[0])
        i = i + 1

    print('KONIEC: Cycle no. ', cycle)
    print('Deleting the content of the card...')

结果

Stress test results

编辑: 我知道删除后的下一个文件的文件名结尾应比上一个添加的文件大一个。在此示例中,应为Saving file_22而不是Saving file_23。删除过程中使用了第22个“ i”,但是如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

您按ctime而不是按字母顺序对文件进行排序,所以不要假设最早的文件将是file_1。让我们用简化的代码来查看一下:

import os
import sys

from datetime import datetime

FILES_NUM = 10
FILE_SIZE = 10


def main():
    for i in range(1, FILES_NUM + 1):
        if i == 5: # Assume disk usage has been exceeded
            files = sorted(os.listdir('.'), key=os.path.getctime)
            files = [
                f'{i} - {datetime.fromtimestamp(os.path.getctime(i))}'
                for i in files
                if i.startswith('file_')
            ]
            print(f'Files list: {files}')
            print(f'Deleted oldest file: {files[0]}')

        print(f'Saving file{i}')
        with open(f'file_{i}', 'wb') as f:
            f.write(os.urandom(FILE_SIZE))


if __name__ == '__main__':
    main()

首次运行(无文件):

$ python test.py
Saving file1
Saving file2
Saving file3
Saving file4
Files list: ['file_1 - 2019-05-30 15:36:36.366754', 'file_2 - 2019-05-30 15:36:36.367754', 'file_4 - 2019-05-30 15:36:36.367754', 'file_3 - 2019-05-30 15:36:36.367754']
Deleted oldest file: file_1 - 2019-05-30 15:36:36.366754
Saving file5
Saving file6
Saving file7
Saving file8
Saving file9
Saving file10

秒运行(旧文件已经存在):

$ python test.py
Saving file1
Saving file2
Saving file3
Saving file4
Files list: ['file_6 - 2019-05-30 15:36:36.367754', 'file_5 - 2019-05-30 15:36:36.367754', 'file_7 - 2019-05-30 15:36:36.367754', 'file_8 - 2019-05-30 15:36:36.368754', 'file_10 - 2019-05-30 15:36:36.368754', 'file_9 - 2019-05-30 15:36:36.368754', 'file_1 - 2019-05-30 15:37:00.360535', 'file_2 - 2019-05-30 15:37:00.361535', 'file_4 - 2019-05-30 15:37:00.361535', 'file_3 - 2019-05-30 15:37:00.361535']
Deleted oldest file: file_6 - 2019-05-30 15:36:36.367754
Saving file5
Saving file6
Saving file7
Saving file8
Saving file9
Saving file10

您可以看到第二次运行期间最早的文件是file_6。这是因为当磁盘使用率超过阈值时,我们进入if分支,在其中对现有文件进行排序和列出,此时仅创建了1-4个文件,因此5-10个文件仍旧。

请注意,ctime是UNIX系统上最后一次元数据更改的时间(文件所有权,权限,而不是内容修改)。您可以尝试mtime按修改日期排序。

在代码中的逻辑稍作更改后,索引问题现在也应该得到解决。

注意:示例使用的是Python 3.7 +