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']}}
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP