(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 шт):

Автор решения: Viewed

Ваш код можно упростить.

  • Большой блок условий по получению текущего месяца излишен. Форматирование 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 пытаетесь добавить имя файла и при том с ошибкой (без \\). И что-то намудрили с созданием папки, поскольку папка дня содержит не число, а полную дату.

→ Ссылка