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

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

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

Затем я зацикливаю каждое регулярное выражение с допустимым именем файла, если оно совпадает, добавляю его к «действительному» словарю, если нет, то же самое делаю с регулярными выражениями с отсутствующим именем файла, если оно совпадает с этим, я добавляю его к «недопустимому» "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
}
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
456
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

с тем фактом, что вы разрешаете только имена файлов с: "показать название", "номер сезона 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..

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

  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, что имеет смысл, но добавляет сложности.

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

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