Como verificar se o conjunto de arquivos está em conformidade com um esquema de nomenclatura
-
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
ouShow Name - [01xSpecial02] - Special Name.avi
ouShow 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
}
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:
- Obtenha uma lista de todos os arquivos
- 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/'
}
- Divida o nome do arquivo com base no delimitador.
- 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.