TransWikia.com

Алгоритм сортировки файлов по дате их изменения работает неправильно

Stack Overflow на русском Asked by 1misha23 on December 26, 2021

На OS X Python 3.7 я написал функцию, которая сортирует файлы, находящиеся в исходной папке в словарь словарей по дате их последнего изменения.

Сортировка происходит по году и месяцу.
Схематично конечный результат должен выглядеть так:

{2019: {1: [object_1, object_2], 2:[object_3]}, 2018: {1: [object_4], 5: [object_5, object_6]} 

Мой код не справляется с задачей, создает нужные ключи по годам и месяцам, но к каждому месяцу присваивает значение одного объекта, а должно быть намного больше (в исходной папке 400 файлов). На выходе в словаре вместо 400 отсортированных файлов вижу 13 файлов.

Вот мой код:

import os, sys
import time as tm

dict_year = {}

def get_time(path):
    path_normalized = os.path.normpath(path)
    for dirpath, dirnames, filenames in os.walk(path_normalized):
        for file in filenames:
            full_file_path = os.path.join(dirpath, file)
            stat = os.stat(full_file_path)
            time = stat.st_mtime
            file_time = tm.gmtime(time)

            if file_time[0] in dict_year:
                for month in dict_year.values():
                    if file_time[1] in dict_year.values():
                        dict_year[file_time[0]][file_time[1]].append(full_file_path)
                        break
                    else:
                        dict_year[file_time[0]][file_time[1]] = [full_file_path]
            else:
                dict_year[file_time[0]] = {file_time[1]: [full_file_path]}

Получившийся вывод(13 объектов в словаре, вместо 400):

{2017: {5: ['icons/status/weather-snow.png'],
        6: ['icons/status/mail-attachment.png'],
        7: ['icons/status/trophy-silver.png'],
        8: ['icons/status/weather-few-clouds.png'],
        9: ['icons/status/weather-fog.png'],
        10: ['icons/status/weather-few-clouds-night.png'],
        11: ['icons/status/user-trash-full.png'],
        12: ['icons/status/weather-clear.png']},
 2018: {1: ['icons/status/semi-starred.png'],
        2: ['icons/status/trophy-bronze.png'],
        3: ['icons/status/weather-storm.png'],
        4: ['icons/status/semi-starred-rtl.png'],
        5: ['icons/status/weather-showers.png']}}

One Answer

dict_year - это словарь словарей. К путям, хранимым в нем вы можете обращаться по dict_year[year][month], поэтому вам не нужно перебирать в цикле все добавленные месяца данного года. Далее у вас была ошибка в условии if file_time[1] in dict_year.values():, то есть вы написали если месяц (строка) в списке словарей, которое никогда не выполнялось, потому что оператор in сравнивает это строку со словарями в dict_year на равенство.

import os, sys
import time as tm

dict_year = {}

def get_time(path):
    path_normalized = os.path.normpath(path)
    for dirpath, dirnames, filenames in os.walk(path_normalized):
        for file in filenames:
            full_file_path = os.path.join(dirpath, file)
            stat = os.stat(full_file_path)
            time = stat.st_mtime
            file_time = tm.gmtime(time)

            if file_time[0] in dict_year:
                if file_time[1] in dict_year[file_time[0]]:
                    dict_year[file_time[0]][file_time[1]].append(full_file_path)
                else:
                    dict_year[file_time[0]][file_time[1]] = [full_file_path]
            else:
                dict_year[file_time[0]] = {file_time[1]: [full_file_path]}

Теперь работает.

Answered by EzikBro on December 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP