Domanda

Ho un sacco di file (episodi TV, anche se è abbastanza arbitrario) che voglio verificare che corrispondano a uno specifico schema di denominazione/organizzazione.

Attualmente:Ho tre array di espressioni regolari, uno per nomi di file validi, uno per i file a cui manca il nome di un episodio e uno per percorsi validi.

Quindi, eseguo il loop di ciascuna regex con nome file valido, se corrisponde, la aggiungo a un dict "valido", in caso contrario, faccio lo stesso con le regex con nome ep mancante, se corrisponde a questo la aggiungo a un "non valido" " dict con un codice di errore (2:'nome epsiode mancante'), se non corrisponde a nessuno dei due, viene aggiunto a non valido con il codice di errore 'nome malformato'.

È possibile trovare il codice attuale Qui

Voglio aggiungere una regola che controlli la presenza di un file cartella.jpg in ciascuna directory, ma aggiungerla renderebbe il codice sostanzialmente più disordinato nel suo stato attuale..

Come potrei scrivere questo sistema in un modo più espandibile?

Le regole da verificare sarebbero...

  • Il file è nel formato Show Name - [01x23] - Episode Name.avi O Show Name - [01xSpecial02] - Special Name.avi O Show Name - [01xExtra01] - Extra Name.avi
  • Se il nome file è nel formato Show Name - [01x23].avi visualizzalo nella sezione "nome episodio mancante" dell'output
  • Il percorso dovrebbe essere nel formato Show Name/season 2/the_file.avi (dove stagione 2 dovrebbe essere il numero di stagione corretto nel nome del file)
  • ogni Show Name/season 1/ la cartella dovrebbe contenere "cartella.jpg"

.qualche idea?Mentre provo a controllare gli episodi TV, questo concetto/codice dovrebbe potersi applicare a molte cose...

L'unico pensiero che ho avuto è stato un elenco di dict nel 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
}
È stato utile?

Soluzione

Voglio aggiungere una regola che controlla la presenza di una cartella.jpg in ogni directory, ma aggiungere questo renderebbe il codice sostanzialmente più disordinato nello stato attuale.

Questo non sembra male.In effetti il ​​tuo codice attuale lo fa molto bene e Sven ha menzionato anche un buon modo per farlo:

  1. Ottieni un elenco di tutti i file
  2. Controlla i file "richiesti".

Dovresti semplicemente aggiungere al tuo dizionario un elenco di file richiesti:

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

Per quanto riguarda un modo migliore/estensibile per farlo?Non ne sono esattamente sicuro.Potevo solo pensare a un modo per eliminare le espressioni regolari "multiple" e sviluppare l'idea di Sven di utilizzare un delimitatore.Quindi la mia strategia sarebbe quella di definire un dizionario come segue (e mi dispiace non conoscere la sintassi di Python e sono un po' pigro per cercarlo, ma dovrebbe avere senso./regex/ è una scorciatoia per una 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. Dividi il nome del file in base al delimitatore.
  2. Controllare ciascuna delle parti.

Poiché si tratta di un elenco ordinato, puoi determinare quali parti mancano e se una sezione non corrisponde a nessun modello è malformata.Ecco il parts E patterns hanno un rapporto 1 a 1.Due array invece di un dizionario impongono l'ordine.

È possibile elencare i file ignorati e richiesti.IL . E .. i file dovrebbero probabilmente essere ignorati automaticamente.All'utente dovrebbe essere consentito di inserire "globs" che possono essere espansi tramite shell.Ci sto pensando qui svn:ignore proprietà, ma il globbing è naturale per elencare i file.

Qui start_dir sarebbe predefinito per la directory corrente, ma se desideri che un singolo file esegua test automatizzati su un gruppo di directory questo sarebbe utile.

La vera questione qui è il modello di percorso e, sulla stessa linea, quale percorso è richiesto per i "file validi".Non potevo davvero avere un'idea solida senza scrivere una grande espressione regolare e prendere dei gruppi da essa...per costruire un modello.Sembrava di scrivere una grammatica del linguaggio TextMate.Ma questo inizia ad allontanarsi dalla facilità d'uso.Il vero problema era che il modello del percorso non era composto parts, il che ha senso ma aggiunge complessità.

Questa strategia è in sintonia con ciò a cui stavi pensando?

Altri suggerimenti

forse dovresti adottare l'approccio predefinito per:"il nome del file è corretto" e da lì lavora per confutare tale affermazione:

con il fatto che consenti solo nomi di file con:'nome spettacolo', 'numero stagione x numero episodio' e 'nome episodio', sai per certo che questi elementi dovrebbero essere separati da un "-" (trattino), quindi devi averne 2 affinché il nome file sia corretto .
se è corretto, puoi utilizzare il tuo codice per verificare che il nome dello spettacolo corrisponda al nome dello spettacolo come visto nella cartella principale del genitore (presumo senza distinzione tra maiuscole e minuscole), il numero della stagione corrisponde al valore numerico della cartella genitori (con o senza uno 0 extra anteposto).

se tuttavia non vedi la quantità corretta di trattini capisci immediatamente che c'è qualcosa che non va e ti interrompi prima del resto dei test, ecc.

e separatamente puoi controllare se il file folder.jpg esiste e intraprende le azioni necessarie. O fallo prima e filtra quel file dal resto dei file in quella cartella.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top