Como verificar se o conjunto de arquivos está em conformidade com um esquema de nomenclatura

StackOverflow https://stackoverflow.com/questions/19030

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho um monte de arquivos (episódios de TV, embora isso seja bastante arbitrário) que quero verificar se correspondem a um esquema de nomenclatura/organização específico.

Atualmente:Eu tenho três matrizes de regex, uma para nomes de arquivos válidos, uma para arquivos sem nome de episódio e uma para caminhos válidos.

Em seguida, faço um loop em cada regex de nome de arquivo válido, se corresponder, anexe-o a um dict "válido", se não, faça o mesmo com as regexs de nome de ep ausente, se corresponder a isso, anexe-o a um "inválido "dict com um código de erro (2:'nome do epsiode ausente'), se não corresponder a nenhum deles, será adicionado como inválido com o código de erro 'nome malformado'.

O código atual pode ser encontrado aqui

Quero adicionar uma regra que verifique a presença de um arquivo folder.jpg em cada diretório, mas adicionar isso tornaria o código substancialmente mais confuso em seu estado atual.

Como eu poderia escrever este sistema de uma forma mais expansível?

As regras que ele precisa verificar seriam ..

  • O arquivo está no formato Show Name - [01x23] - Episode Name.avi ou Show Name - [01xSpecial02] - Special Name.avi ou Show Name - [01xExtra01] - Extra Name.avi
  • Se o nome do arquivo estiver no formato Show Name - [01x23].avi exibir uma seção de 'nome do episódio ausente' da saída
  • O caminho deve estar no formato Show Name/season 2/the_file.avi (onde a 2ª temporada deve ser o número correto da temporada no nome do arquivo)
  • cada Show Name/season 1/ a pasta deve conter "folder.jpg"

.alguma ideia?Enquanto tento verificar episódios de TV, esse conceito/código deve ser aplicado a muitas coisas.

O único pensamento que tive foi uma lista de dictos no formato:

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
}
Foi útil?

Solução

Quero adicionar uma regra que verifique a presença de um arquivo pasta.jpg em cada diretório, mas adicionar isso tornaria o código substancialmente mais confuso no estado atual.

Isso não parece ruim.Na verdade, seu código atual faz isso muito bem, e Sven mencionou uma boa maneira de fazer isso também:

  1. Obtenha uma lista de todos os arquivos
  2. Verifique se há arquivos "obrigatórios"

Você apenas teria que adicionar ao seu dicionário uma lista de arquivos necessários:

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

Na medida em que existe uma maneira melhor/extensível de fazer isso?Não tenho certeza.Eu só conseguia pensar em uma maneira de eliminar as "múltiplas" expressões regulares e desenvolver a ideia de Sven de usar um delimitador.Portanto, minha estratégia seria definir um dicionário da seguinte maneira (e me desculpe, não conheço a sintaxe do Python e estou com preguiça de procurá-lo, mas deve fazer sentido.O /regex/ é uma abreviação de 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. Divida o nome do arquivo com base no delimitador.
  2. Confira cada uma das peças.

Por ser uma lista ordenada, você pode determinar quais partes estão faltando e se uma seção não corresponder a nenhum padrão, ela estará malformada.Aqui o parts e patterns tem uma proporção de 1 para 1.Duas matrizes em vez de um dicionário reforçam a ordem.

Arquivos ignorados e necessários podem ser listados.O . e .. os arquivos provavelmente devem ser ignorados automaticamente.O usuário deve ter permissão para inserir "globs" que podem ser expandidos pelo shell.Estou pensando aqui svn:ignore propriedades, mas globbing é natural para listar arquivos.

Aqui start_dir seria o padrão para o diretório atual, mas se você quisesse que um único arquivo executasse testes automatizados de vários diretórios, isso seria útil.

A verdadeira ponta solta aqui é o modelo de caminho e, na mesma linha, qual caminho é necessário para "arquivos válidos".Eu realmente não poderia ter uma ideia sólida sem escrever uma grande expressão regular e retirar grupos dela...para construir um modelo.Foi como escrever uma gramática da linguagem TextMate.Mas isso começa a prejudicar a facilidade de uso.O verdadeiro problema era que o modelo de caminho não era composto de parts, o que faz sentido, mas adiciona complexidade.

Essa estratégia está em sintonia com o que você estava pensando?

Outras dicas

talvez você deva adotar a abordagem padrão:"o nome do arquivo está correto" e trabalhe a partir daí para refutar essa afirmação:

com o fato de que você só permite nomes de arquivos com:'nome do programa', 'número da temporada x número do episódio' e 'nome do episódio', você sabe com certeza que esses itens devem ser separados por um "-" (traço), então você precisa ter 2 deles para que o nome do arquivo esteja correto .
se isso acontecer, você pode usar seu código para verificar se o nome do programa corresponde ao nome do programa conforme visto na pasta pai dos pais (sem distinção entre maiúsculas e minúsculas, presumo), o número da temporada corresponde ao valor numérico da pasta dos pais (com ou sem um 0 extra anexado).

se, no entanto, você não vir a quantidade correta de traços, saberá instantaneamente que há algo errado e parará antes do restante dos testes, etc.

e separadamente você pode verificar se o arquivo folder.jpg existe e tomar as ações necessárias. ou faça isso primeiro e filtre esse arquivo do restante dos arquivos dessa pasta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top