Сведения о вопросе

Fedya

14:16, 7th August, 2020

Теги

python   validation   naming    

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

Просмотров: 486   Ответов: 2

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

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

Тогда я петли хоть каждый действительный-именем regex, если они совпадают, то добавить его "valid" дикт, если не, сделать тоже самое с missing-ep-name regexs, если он соответствует этому нужно присоединить к "invalid" дикт с кодом ошибки (2:'отсутствует epsiode имя'), если он не соответствует, он будет добавлен к недействительным с 'malformed name' код ошибки.

Текущий код можно найти здесь

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

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

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

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
}



  Сведения об ответе

PIRLO

12:25, 14th August, 2020

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

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

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

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

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

Насколько существует лучший / расширяемый способ сделать это? Я не совсем уверен. Я мог только действительно думать о способе, возможно, отбросить регулярные выражения "multiple" и построить идею Свена для использования разделителя. Поэтому моя стратегия будет определять словарь следующим образом (и мне жаль, что я не знаю синтаксиса Python, и я немного ленив, чтобы посмотреть его, но это должно иметь смысл. /regex/-это сокращение для 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. Два массива вместо словаря обеспечивает порядок.

Игнорируемые и необходимые файлы могут быть перечислены. Файлы . и .. , вероятно, следует игнорировать автоматически. Пользователю должно быть разрешено ввести "globs", который может быть расширен shell. Я думаю здесь о свойствах svn:ignore , но глобализация естественна для перечисления файлов.

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

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

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


  Сведения об ответе

+-*/

07:21, 26th August, 2020

возможно, вам следует принять подход дефолта к: "the filename is correct" и работать оттуда, чтобы опровергнуть это утверждение:

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться