Проблема с переносом файлов из папки на Python
У меня есть простая python программа, которая извлекает из zip архива по указанному пути все файлы, сохраняет их в отдельную папку, потом выдергивает из названия файлов дату и в соответствии с этой датой создает для каждого файла со своей датой новую папку соответствующую этой дате. Проблема в том, что мой код это делает единоразово. Т.е. после создания папки и перемещения туда соответствующих файлов, я не могу запустить свой код для другого zip архива если там присутствуют файлы с той же датой. Как сделать так, чтобы, если папка с таким названием уже существует, то к ней просто добавлялись файлы, и программа не пыталась создавать новую папку?
import zipfile
import os
# Путь к архиву
archive_path = "C:\\Users\\Doc\\Downloads\\Archive.zip"
# Путь к папке, куда будут извлечены файлы
extract_path = "C:\\Users\\Doc\\Desktop\\Archieves"
# Открываем архив
with zipfile.ZipFile(archive_path, 'r') as zip_ref:
# Извлекаем все файлы
zip_ref.extractall(extract_path)
# Получаем список файлов в папке
file_list = os.listdir(extract_path)
# Проходимся по каждому файлу
for file in file_list:
# Получаем дату из имени файла
date = file.split('_')[0]
# Создаем папку с датой, если она еще не существует
date_path = os.path.join(extract_path, date)
if not os.path.exists(date_path):
os.mkdir(date_path)
# Перемещаем файл в папку с датой
os.rename(os.path.join(extract_path, file), os.path.join(date_path, file))
Ответы (1 шт):
Если говорить очень коротко, то скрипт пытается перенести созданную папку в нее саму.
Распаковывать нужно во временную папку, чтобы не возникало разных интересных ситуаций вроде этой.
Например:
extract_path_temp = r"C:\Users\Doc\Desktop\Archieves_temp"
И соответствующим образом подправить другие строчки:
with zipfile.ZipFile(archive_path, 'r') as zip_ref:
# Извлекаем все файлы
zip_ref.extractall(extract_path_temp) # <---
# Получаем список файлов в папке
file_list = os.listdir(extract_path_temp) # <---
И здесь:
os.rename(os.path.join(extract_path_temp, file), os.path.join(date_path, file))
Папку r"C:\Users\Doc\Desktop\Archieves_temp"
при желании можно удалить после завершения работы скрипта:
os.rmdir(extract_path_temp)
Стоит еще помнить, что если в двух архивах будут файлы с одинаковыми именами, то тоже будет ошибка, но другая: FileExistsError
. Как ее решать зависит от автора.