Как проверить набор файлов на соответствие схеме именования - PullRequest
3 голосов
/ 21 августа 2008

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

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

Затем я зацикливаю хотя бы каждое регулярное выражение действительного имени файла, если оно совпадает, добавляю его к «действительному» дикту, если нет, делаю то же самое с регулярным выражением пропущенного имени, если оно совпадает с этим, я добавляю его к «недопустимый» файл с кодом ошибки (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 (где сезон 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
}

Ответы [ 2 ]

2 голосов
/ 22 августа 2008

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

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

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

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

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

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

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 голосов
/ 21 августа 2008

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

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

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

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

...