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

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

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

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

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

2
21.08.2008 22:02:01

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

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

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

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

0
11.08.2012 15:56:22