Список файлов, возвращаемых os.walk, находится не в каком-либо видимом порядке. - PullRequest
0 голосов
/ 25 апреля 2020

Есть ли способ отсортировать список имен файлов, возвращаемых os.walk, так, чтобы он возвращал список из самого младшего файла в самый старый файл? Я пытаюсь написать код, который удаляет файлы через определенное время.

Вот что у меня есть:

import os
import time
import shutil
from pathlib import pathlib
os.chdir("/home/pi/Videos")

while True:
    for root, files in os.walk(".", topdown = True)
        for name in files:
            f = os.path.join(root, name)
            print(f)

    st = os.stat(f)
    age = time.time()-st.st_mtime)
    print(age)
    if age > 200
       os.remove(f)
    time.sleep(1)

Это работает для удаления любых файлов в папке, но если файл этот вопрос недостаточно взрослый, чтобы его можно было удалить, он будет ждать, пока файл не удастся удалить, пока он не перейдет к следующему файлу. Это проблема. D: <Я пытался использовать библиотеки shutil, pathlib и os, чтобы переместить файл из папки, в которой он находится, обратно в папку, в которой он находится, но это ничего не меняет. ): <Я не знаю библиотек. (Я новичок) </p>

Мне нужно либо организовать список, возвращаемый методом os.walk (), чтобы самые старые находились внизу (или сверху) не имеет значения) или есть способ пропустить файл, если файл несовершеннолетний. Любая помощь будет принята с благодарностью. : D

1 Ответ

0 голосов
/ 26 апреля 2020

Я понял это благодаря @jpf, но мне пришлось полностью переделать мой код, основываясь на их предложении. Как указано в вопросе, моей конечной целью является код, который удаляет файлы старше x раз.

Вот код, который я придумал, основываясь на предложении.

import os
import time
os.chdir("/home/pi/Videos")
max_age = 50000 #this sets the maximum age of the files
while True:
    list_of_files = os.listdir() #returns list of all files in a folder
    sorted_list = sorted(list_of_files,key = os.path.getmtime)#sorts list based on age
    file = sorted_list[0] #defines oldest file in list
    st = os.stat(file) 
    age = (time.time() - st.st_mtime) #returns age of file in seconds by subtracting time since epoch from time of file metadata change
    print(file,"is",age,"seconds old")
    if age > max_age: #checks if file is older than max_age 
         print(file,"is older than ",max_age," seconds old") #if older prints this statement and deletes the file
         os.remove(file)
    else   #if younger then the loop breaks
         break

Этот код использует os.listdir для возврата имен файлов в списке. Затем я использовал сортировку, чтобы отсортировать этот список от самого старого до самого младшего. Затем я начал процесс удаления со самого старого до самого младшего, сломав его, когда возраст файла был слишком молод для удаления.

...