У меня есть куча файлов (телепередачи, хотя это довольно произвольно), которые я хочу проверить, соответствуют определенной схеме именования / организации ..
В настоящее время: у меня есть три массива регулярных выражений: один для допустимых имен файлов, один для файлов без названия эпизода и один для допустимых путей.
Затем я зацикливаю каждое регулярное выражение с допустимым именем файла, если оно совпадает, добавляю его к «действительному» словарю, если нет, то же самое делаю с регулярными выражениями с отсутствующим именем файла, если оно совпадает с этим, я добавляю его к «недопустимому» "dict с кодом ошибки (2: 'отсутствует имя эпсиода'), если он не соответствует ни одному, он будет добавлен как недопустимый с кодом ошибки 'неверное имя'.
Текущий код можно найти здесь
Я хочу добавить правило, которое проверяет наличие файла 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".есть идеи? Пока я пытаюсь проверить сериалы, эту концепцию / код можно применить ко многим вещам.
Единственное, что у меня было, это список диктовок в формате:
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
}






возможно, вам следует использовать подход по умолчанию к: «имя файла правильное» и работать оттуда, чтобы опровергнуть это утверждение:
с тем фактом, что вы разрешаете только имена файлов с: "показать название", "номер сезона x номер эпизода" и "название эпизода", вы точно знаете, что эти элементы должны быть разделены знаком "-" (тире), поэтому вам нужно иметь 2 из них для правильного имени файла.
если это подтвердится, вы можете использовать свой код, чтобы проверить, что имя шоу соответствует имени шоу, которое видно в родительской папке (без учета регистра, я полагаю), номер сезона соответствует числовому значению родительской папки (с дополнительным 0 или без него) добавлено).
однако если вы не видите правильного количества штрихов, вы сразу узнаете, что что-то не так, и останавливаетесь перед выполнением остальных тестов и т. д.
и отдельно вы можете проверить, существует ли файл folder.jpg и предпринять необходимые действия. или же сделает это первым и отфильтрует этот файл от остальных файлов в этой папке.
I want to add a rule that checks for the presence of a folder.jpg file in each directory, but to add this would make the code substantially more messy in it's current state..
Это неплохо. Фактически, ваш текущий код делает это очень хорошо, и Свен также упомянул хороший способ сделать это:
Вам просто нужно было бы добавить в свой словарь список необходимых файлов:
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/'
}
Поскольку это упорядоченный список, вы можете определить, какие части отсутствуют, и если раздел не соответствует какому-либо шаблону, он искажен. Здесь parts и patterns имеют соотношение 1: 1. Два массива вместо словаря обеспечивают порядок.
Могут быть перечислены проигнорированные и обязательные файлы. Файлы . и .., вероятно, следует игнорировать автоматически. Пользователю должно быть разрешено вводить «глобусы», которые можно раскрыть в оболочке. Я думаю здесь о свойствах svn:ignore, но для перечисления файлов естественно использовать подстановку.
Здесь start_dir будет по умолчанию для текущего каталога, но если вы хотите, чтобы один файл запускал автоматическое тестирование группы каталогов, это было бы полезно.
Настоящий свободный конец здесь - это шаблон пути и, в том же смысле, какой путь требуется для "действительных файлов". Я действительно не мог придумать твердой идеи, не написав одно большое регулярное выражение и не взяв из него группы ... для создания шаблона. Это было похоже на написание грамматики языка TextMate. Но это начинает сказываться на простоте использования. Настоящая проблема заключалась в том, что шаблон пути не был составлен из parts, что имеет смысл, но добавляет сложности.
Соответствует ли эта стратегия тому, о чем вы думали?