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


2

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

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

Затем, если каждый из них соответствует регулярному выражению valid-filename, добавьте его в «действительный» dict, если нет, выполните то же самое с регулярными выражениями отсутствующего ep-name, если он соответствует этому, я добавляю его к «неверному» типу с кодом ошибки (2: «отсутствует имя epsiode»), если оно не соответствует ни одному из них, оно добавляется к недопустимому с кодом ошибки «неправильное имя».

Текущий код можно найти here

Я хочу, чтобы добавить правило, которое проверяет наличие в 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 (где сезон 2 должен быть правильный номер сезона в имени файла)
  • каждый Show Name/season 1/ папки должен содержать «folder.jpg»

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

Единственная мысль, которую я имел, был список dicts в формате:

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 
} 
2

Я хочу, чтобы добавить правило, которое проверяет присутствие файла 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, но globbing является естественным для листинга файлов.

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

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

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


0

может быть вам следует воспользоваться принципом дефолта: «имя файла верное» и работать оттуда, чтобы опровергнуть это утверждение:

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

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

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