Поиск новых файлов в поддиректориях. Python
Всем привет! Я новичок в Python. Сейчас у меня задача автоматизация работы с бэкапами. Есть локальный диск, на котором есть , к примеру 20 папок, в которых находятся .7z файлы. Количество файлов с каждым днём растёт, но думаю это не важно. Мне нужно из каждой папки доставать последний созданный архив и разархивировать его в другую директорию. У меня есть код, который проходится по папкам и все файлы собирает в один список и после разархивирует ВСЕ файлы списка. Из общего списка я не могу отсортировать нужные файлы. Прошу подсказки, как я могу выбирать нужные файлы по дате создания из каждой папки. Прилагаю код:
import os
import py7zr as zp
os.chdir("d:\dir1")
for root, dirs, files in os.walk(".", topdown = False):
for name in files:
a = os.path.join(root, name)
print(a)
with zp.SevenZipFile(a) as my_zip_file:
my_zip_file.extract('d:\dir2')
Ответы (3 шт):
Для того чтобы выбрать последний созданный файл в каждой папке, тебе нужно использовать функцию os.path.getctime для получения времени создания файла и затем отсортировать файлы по времени создания.
Из каждой директории надо взять файл с максимальной датой создания. Проблема в том, что операция получения даты создания файла платформозависимая. Вот тут подробно. Я исхожу из того, что у тебя Windows, но если тебе нужна кроссплатформенность, см. ссылку выше. Действуем так: собираем пути+файлы из каждой директории в список и потом получаем файл с максимальной датой создания. Решение для Windows:
import os
import py7zr as zp
os.chdir("d:\dir1")
for root, dirs, files in os.walk(".", topdown = False):
file_list = [os.path.join(root, name) for name in files]
the_last_archive = max(file_list, key=os.path.getctime)
print(the_last_archive)
with zp.SevenZipFile(the_last_archive) as my_zip_file:
my_zip_file.extract('d:\dir2')
Сразу прошу прощения, код не проверял.
Я бы решил вопрос через datetime, примерно так:
import os
from datetime import datetime, timedelta
source_dir = "C:\\Users\\Amgarak\\Downloads"
# Для примера воспользуемся дельтой, относительно текущей даты
target_date_delta = timedelta(days=7) # Например, 7 дней назад
# Получаем текущую дату и вычитаем дельту
target_date = datetime.now() - target_date_delta
for root, dirs, files in os.walk(source_dir, topdown=False):
for name in files:
file_path = os.path.join(root, name)
# Получаем время создания файла
file_creation_time = os.path.getctime(file_path)
# Преобразуем время создания в формат datetime
creation_datetime = datetime.fromtimestamp(file_creation_time)
# Тут можете реализовать свою логику фильтра
# Например, можно выбрать файлы созданные после вычисленной ранее даты
if creation_datetime > target_date:
print(file_path)