После длинных выходных иногда нам хочется встретиться с коллегами и поделиться своими историями о том, что произошло за выходные, или, что еще лучше, услышать последние сплетни. Но нет, вы должны прервать это, потому что вы несете ответственность за утреннюю рутину перемещения, переименования или удаления файлов из одного места в другое, чтобы начать свой день.

Было бы неплохо, если бы вы могли нажать кнопку, чтобы выполнить все утомительные задачи?

Этот пример покажет один из способов высвободить время, чтобы услышать лучшую часть истории вашего коллеги.

В этом примере мы будем использовать электронную таблицу в качестве файла конфигурации. Затем мы будем использовать файл конфигурации в нашем скрипте, который перемещает, переименовывает и удаляет файлы. Электронная таблица может выглядеть примерно так:

Теперь как в моей статье Базовое преобразование Excel в словарь. Мы начнем с установки библиотеки pandas. После того, как вы установили pandas, вы можете использовать функцию read_excel для переноса данных электронной таблицы в DataFrame.

Затем давайте прочитаем данные в фрейм данных под названием «options», используя метод to_dictpython.

import pandas as pd

# Read the spreadsheet into a DataFrame
df = pd.read_excel('morning_joe.xlsx')

# Convert the DataFrame into a dictionary
options = df.set_index('Option').to_dict()['Value']

#print the variable options
print(f'here is the output for the variable options {options}')

Метод примет первый столбец в качестве ключа словаря, а остальные столбцы — в качестве значений для этого ключа. Этот пример позволяет нам использовать столбец параметров в качестве ключа словаря, а остальные данные — в качестве значения для этого ключа.

Вот пример вывода(Как видите, в результате отображаются все необходимые данные, относящиеся к столбцу параметра и столбцу значения):

{'source_directory': '/home/user/documents',
 'target_directory': '/home/user/archives',
 'file_pattern': '*.txt',
 'rename': True,
 'delete': False
}

Далее мы будем использовать два дополнительных модуля Python:

модуль pathlib, точнее, класс path
(который обеспечивает удобный способ работы с путями к файлам и каталогами)

модуль даты и времени(который позволит нам генерировать метку времени)

from pathlib import Path
import datetime

Теперь самое интересное: мы создадим функцию move_and_rename_files() и передадим словарь параметров с набором значений по умолчанию, которые мы преобразовали из нашей электронной таблицы.
Теперь у нас есть словарь параметров, и мы можем точно так же указать конфигурацию для нашего скрипта. как любой другой словарь. Например, вы можете использовать его в следующей функции:

from pathlib import Path
import datetime

def move_and_rename_files(options={'source_directory': '', 
'target_directory': '',
 'file_pattern': '*',
 'rename': False,
 'delete': False}):

  # Extract options from the dictionary
  source_directory = Path(options['source_directory'])
  target_directory = Path(options['target_directory'])
  file_pattern = options['file_pattern']
  rename = options['rename']
  delete = options['delete']

 

Далее создадим список всех файлов, соответствующих шаблону, и сохраним их в переменной files. Затем мы создадим новый путь к файлу, который будем использовать, если нам понадобится переименовать, переместить или удалить файлы.

Get a list of all matching files in the source directory
  files = list(source_directory.glob(file_pattern))

  # Iterate over the files and move and/or rename them
  for file in files:
    # Extract the filename and extension from the file path
    filename = file.stem
    extension = file.suffix

    # Construct the new file path
    new_file = target_directory / (filename + extension)

Теперь особый соус, давайте создадим три условия для завершения нашего скрипта.

# If renaming is enabled, add a timestamp to the filename
    if rename:
      new_file = target_directory / (filename + '-' + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + extension)

    # Move the file to the target directory
    file.replace(new_file)

    # If deleting is enabled, delete the file from the source directory
    if delete:
      file.unlink()

Функция переместит и переименует все файлы в исходном_каталоге, которые соответствуют шаблону файла, указанному в словаре параметров.

Если для параметра rename установлено значение True в словаре параметров, функция добавит метку времени к имени каждого файла перед его перемещением в target_directory.

Если для удаления установлено значение True в словаре параметров, функция удалит каждый файл из исходного_каталога после его перемещения в целевой_каталог.

Функция пропустит эти шаги, если для переименования или удаления установлено значение False в словаре параметров.

осталось только вызвать функцию и приготовиться к разговору за чашечкой кофе.

# Use the options dictionary as the default values for the options argument in the move_and_rename_files function
move_and_rename_files(options)

Ну, это пока. Обязательно подписывайтесь и подписывайтесь на меня. Следите за обновлениями; Мы добавим в этот скрипт некоторые функции обработки ошибок и интересные функции. Удачного кодирования!

Вот несколько ресурсов, которые могут быть вам полезны:

  1. моя статья Базовое преобразование Excel в словарь
  2. модуль pathlib
  3. модуль даты и времени

Полный сценарий:

import pandas as pd
from pathlib import Path
import datetime


# Read the spreadsheet into a DataFrame
df = pd.read_excel('morning_joe.xlsx')

# Convert the DataFrame into a dictionary
options = df.set_index('Option').to_dict()['Value']
print(f'here is the output for the variable options {options}')

def move_and_rename_files(options={'source_directory': '','target_directory': '', 'file_pattern': '*', 'rename': False, 'delete': False}):

# Extract options from the dictionary
  source_directory = Path(options['source_directory'])
  target_directory = Path(options['target_directory'])
  file_pattern = options['file_pattern']
  rename = options['rename']
  delete = options['delete']
  print(source_directory)


# Get a list of all matching files in the source directory
  files = list(source_directory.glob(file_pattern))

# Iterate over the files and move and/or rename them
  for file in files:
        # Extract the filename and extension from the file path
        filename = file.stem
        extension = file.suffix

        # Construct the new file path
        new_file = target_directory / (filename + extension)

        # If renaming is enabled, add a timestamp to the filename
        if rename:
            new_file = target_directory / (filename + '-' + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + extension)

        # Move the file to the target directory
        file.replace(new_file)

        # If deleting is enabled, delete the file from the source directory
        if delete:
            file.unlink()

move_and_rename_files(options)