(Python) Как переместить файлы?
Дело в том, что я хочу сделать функцию, которая способна создать папки по текущему году, месяцу и дате, а затем переместил все файлы прямо туда. Папки я успешно создал - есть папка года, в ней папка месяца, а в папке с месяцем папка с датой. Всё успешно, но именно перемещение файлов почему-то не удаётся. Говорю сразу, что пользуюсь модулем shutil. Я уберу всё лишнее в коде, чтобы у вас глаза не разбегались.
import shutil, os, time, datetime, os.path
date_time = datetime.datetime.today()
today = datetime.date.today().strftime("%d.%m.%Y")
path = 'D:\\test_folder'
end = 'D:\\second_folder'
list = os.listdir(path); month = None
def upload(a, b):
if date_time.month == 1: month = 'Январь'
elif date_time.month == 2: month = 'Февраль'
elif date_time.month == 3: month = 'Март'
elif date_time.month == 4: month = 'Апрель'
elif date_time.month == 5: month = 'Май'
elif date_time.month == 6: month = 'Июнь'
elif date_time.month == 7: month = 'Июль'
elif date_time.month == 8: month = 'Август'
elif date_time.month == 9: month = 'Сентябрь'
elif date_time.month == 10: month = 'Октябрь'
elif date_time.month == 11: month = 'Ноябрь'
elif date_time.month == 12: month = 'Декабрь'
if not os.path.exists(b + '\\' + str(date_time.year)): os.system('mkdir ' + a + '\\' + str(date_time.year))
if not os.path.exists(b + '\\' + str(date_time.year) + '\\' + month): os.system('mkdir ' + a + '\\' + str(date_time.year) + '\\' + month)
if not os.path.exists(b + '\\' + str(date_time.year) + '\\' + month + '\\' + str(today)): os.system('mkdir ' + a + '\\' + str(date_time.year) + '\\' + month + '\\' + str(today))
for x in list: shutil.move(a, b + '\\' + str(date_time.year) + '\\' + str(month) + '\\' + str(today) + x)
upload(path, end)
Ответы (1 шт):
Ваш код можно упростить.
- Большой блок условий по получению текущего месяца излишен.
Форматирование
strftimeможет дать полное название месяца. Даже на русском. Следует только указать локаль. - Условия проверки существования директории сводится к одному.
- Ваш пример отлично иллюстрирует, что для создания пути лучше использовать
path.join(), а не перечисление кучи\\с плюсами. - Для создания директории с несколькими папками существует метод
os.makedirs()
Следующий код показывает, как получить месяц словом. Формат %B дает полное название месяца, %b сокращенное. Таблицу с остальными параметрами можно посмотреть здесь.
locale.setlocale(locale.LC_ALL, 'ru') # для Windows
# locale.setlocale(locale.LC_ALL, "ru_RU") # для MacOS
day, month, year = datetime.today().strftime('%d.%B.%Y').split('.')
Таким образом, полный код выглядит так
from os import path, listdir, makedirs
from datetime import datetime
import shutil, locale
def move(source, output):
day, month, year = datetime.today().strftime('%d.%B.%Y').split('.')
destination = path.join(output, year, month, day)
if not path.exists(destination):
makedirs(destination)
for file in listdir(source):
filepath = path.join(source, file)
shutil.move(filepath, destination)
locale.setlocale(locale.LC_ALL, 'ru') # для Windows
# locale.setlocale(locale.LC_ALL, "ru_RU") # для MacOS
source = r'D:\source'
output = r'D:\output'
move(source, output)
Что же касается вашего кода, то в нем есть несколько ошибок. Во первых, перемещаете сразу папку a, а не файл shutil.move(a, b...). Во вторых, к целевому каталогу b пытаетесь добавить имя файла и при том с ошибкой (без \\). И что-то намудрили с созданием папки, поскольку папка дня содержит не число, а полную дату.