Как проверить соответствие набора файлов схеме именования

StackOverflow https://stackoverflow.com/questions/19030

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть куча файлов (телевизионных эпизодов, хотя это довольно произвольно), которые я хочу проверить на соответствие определенной схеме именования / организации..

В настоящее время:У меня есть три массива регулярных выражений, один для допустимых имен файлов, один для файлов, в которых отсутствует название эпизода, и один для допустимых путей.

Затем я перебираю каждое регулярное выражение с допустимым именем файла, если оно совпадает, добавляю его к "допустимому" dict, если нет, проделываю то же самое с регулярными выражениями с отсутствующим именем ep, если оно соответствует этому, я добавляю его к "недопустимому" dict с кодом ошибки (2: 'отсутствует имя epsiode'), если оно не соответствует ни тому, ни другому, оно добавляется к недействительному с кодом ошибки 'искаженное имя'.

Текущий код можно найти здесь

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

Как я мог бы написать эту систему более расширяемым способом?

Правила, которые ему нужно проверить, были бы следующими..

  • Файл находится в следующем формате Show Name - [01x23] - Episode Name.avi или Show Name - [01xSpecial02] - Special Name.avi или Show Name - [01xExtra01] - Extra Name.avi
  • Если имя файла указано в формате Show Name - [01x23].avi отобразите в выходных данных раздел "отсутствующее название эпизода"
  • Путь должен быть в следующем формате Show Name/season 2/the_file.avi (где season 2 должен быть правильным номером сезона в имени файла)
  • каждый Show Name/season 1/ папка должна содержать "folder.jpg"

есть какие-нибудь идеи?Пока я пытаюсь проверить телевизионные эпизоды, эта концепция / код должны быть применимы ко многим вещам..

Единственная мысль, которая у меня возникла, - это список диктовок в формате:

checker = [
{
    'name':'valid files',
    'type':'file',
    'function':check_valid(), # runs check_valid() on all files
    'status':0 # if it returns True, this is the status the file gets
}
Это было полезно?

Решение

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

Это выглядит неплохо.На самом деле ваш текущий код делает это очень хорошо, и Свен упомянул хороший способ сделать это:

  1. Получите список всех файлов
  2. Проверьте наличие "обязательных" файлов

Вам просто нужно было бы добавить в свой словарь список необходимых файлов:

checker = {
  ...
  'required': ['file', 'list', 'for_required']
}

Насколько существует лучший / расширяемый способ сделать это?Я не совсем уверен.Я мог только по-настоящему придумать способ, возможно, отказаться от "множественных" регулярных выражений и отталкиваться от идеи Свена по использованию разделителя.Итак, моя стратегия заключалась бы в определении словаря следующим образом (и я сожалею, что не знаю синтаксиса Python, и мне немного лень искать его, но это должно иметь смысл./Regex/ - это сокращение для регулярного выражения):

check_dict = {
  'delim'    : /\-/,
  'parts'    : [ 'Show Name', 'Episode Name', 'Episode Number' ],
  'patterns' : [/valid name/, /valid episode name/, /valid number/ ],
  'required' : ['list', 'of', 'files'],
  'ignored'  : ['.*', 'hidden.txt'],
  'start_dir': '/path/to/dir/to/test/'
}
  1. Разделите имя файла на основе разделителя.
  2. Проверьте каждую из деталей.

Поскольку это упорядоченный список, вы можете определить, каких частей не хватает, и если секция не соответствует какому-либо шаблону, она имеет неправильную форму.Здесь parts и patterns имейте соотношение 1 к 1.Два массива вместо словаря обеспечивают соблюдение порядка.

Могут быть перечислены игнорируемые и требуемые файлы.Тот Самый . и .. файлы, вероятно, должны игнорироваться автоматически.Пользователю должно быть разрешено вводить "глобусы", которые могут быть расширены оболочкой.Я думаю здесь о svn:ignore свойства, но глобализация естественна для перечисления файлов.

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

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

Соответствует ли эта стратегия тому, о чем вы думали?

Другие советы

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

с учетом того факта, что вы разрешаете использовать только имена файлов с:"название шоу", "номер сезона x номер серии" и "название эпизода", вы наверняка знаете, что эти элементы должны быть разделены символом "-" (тире), поэтому у вас должно быть 2 из них, чтобы имя файла было правильным.
если это подтвердится, вы можете использовать свой код, чтобы проверить, что название шоу совпадает с названием шоу, как показано в родительской папке родителя (я полагаю, без учета регистра), номер сезона соответствует числовому значению родительской папки (с добавлением или без добавления дополнительного 0).

однако, если вы не видите правильного количества тире, вы сразу понимаете, что что-то не так, и останавливаетесь перед выполнением остальных тестов и т.д.

и отдельно вы можете проверить, соответствует ли файл folder.jpg существует и предпримет необходимые действия. или сделайте это первым и отфильтруйте этот файл от остальных файлов в этой папке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top