Чистый Каталог


Я абсолютно новичок в Python исходящий от Руби на рельсах. Я строю скрипт очистки для очистки (архивирование, удаление или просмотр) каталоги. Я хотел бы знать все, что я могу сделать лучше, безопаснее, быстрее.

import os
import re
import shutil
import argparse
from datetime import datetime

# Example: python cleanup.py -d u:\jobs -p u:\jobs\pattern_file.txt -r list
"""
Example pattern file:

template
^\d{5,}
twin

"""
parser = argparse.ArgumentParser()
parser.add_argument('-p', type=str, default="pattern_file.txt", help="Pattern File (One item per line, regex or string)")
parser.add_argument('-d', help='Directory to clean up.')
parser.add_argument('-a', help='Minimum number of days old to clean up.')
parser.add_argument('-r', type=str, help='delete, archive or test.')
args = parser.parse_args()


def included_files(directory, pattern_file, age_string = 90):
    """ Find files to move """
    all_files = []
    excluded_files = []

    os.chdir(directory)

    patterns = fix_pattern(pattern_file)
    for fname in os.listdir(directory):
        all_files.append(fname)

        for pattern in patterns:

            # Check for matching pattern in filename
            if re.search(pattern, fname.lower()):  # Regex search
                excluded_files.append(fname)

        # Check to see if the difference in today and modified date is more than "age"
        now = datetime.now()
        then = datetime.fromtimestamp(os.path.getmtime(fname))
        tdelta = now - then
        if type(age_string) == str:
            age = int(age_string)
        else:
            age = 90
        if tdelta.days < age:
            excluded_files.append(fname)
    value = [x for x in all_files if x not in excluded_files]
    return value


def file_maintenance(dir_path, files, type):
    """ File Maintenance """
    if os.path.isdir(dir_path):
        directory = dir_path
    else:
        directory = os.path.dirname(os.path.realpath(__file__))
    archive_directory = os.path.join(directory.strip(), 'archive', "")

    for file in files:
        if os.path.isdir(file) is not True:
            if type is "archive":
                if os.path.isdir(archive_directory) is not True:
                    os.makedirs(archive_directory)
                print("Moving " + os.path.join(directory, file) + " to " + os.path.join(archive_directory, file))
                shutil.move(os.path.join(directory, file), os.path.join(archive_directory, file))
            elif type is "delete":
                print('Deleting ' + os.path.join(directory, file))
                os.remove(file)
            else:
                print("File: " + os.path.join(directory, file))


def fix_pattern(pattern_file):
    if os.path.isfile(pattern_file):
        print("pattern file found")
        with open(pattern_file) as f:
            content = f.readlines()
        pattern = [x.strip() for x in content]

    else:
        print("pattern file not found")
        pattern = []        
    pattern.append('pattern_file')
    return pattern


if __name__ == "__main__":

    files = included_files(args.d, args.p, args.a)
    file_maintenance(args.d, files, args.r)


122
4
задан 5 апреля 2018 в 08:04 Источник Поделиться
Комментарии
1 ответ

Я бы сделал следующее:


  • Использовать PyCharm или IntelliJ идея с плагином на Python. Либо будет обнаруживать несколько из следующих вопросов, и можно просто перебрать их с помощью клавиши F2.

  • Поставить парсинг аргумента внутри функции. Это понятнее и избежать проблем с импортом материалов из другого кода.

  • Запустить код через pycodestyle открыть для себя ряд вопросов, таких как foo is not True что должно быть not foo.

  • Использовать длинное имя опции, такие как --pattern-file чтобы сделать ваши варианты очевидны для нового пользователя.

  • Всегда лечить age_string как int. Это означает, что установка ArgumentParser аргумент типа, переименование параметров и удаление всех if type(age_string) == str вещи.

  • Текст value переменная используется только один раз, и что в тривиальной форме.

  • Использовать один список, а не добавлять все файлы в список, а затем создать список исключения, затем вычитая одно из другого. Сделать все чеки и continue цикл, если какой-либо из них обратиться в файл.

  • Создайте константы для любых магических значений, например archive и 90.

  • Понять, почему строки pattern_file добавляется в шаблон список, и, скорее всего, удалить его.

  • Очевидно, (в коде, а не просто аргумент текст справки), что шаблоны списки исключений.

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

3
ответ дан 5 апреля 2018 в 11:04 Источник Поделиться