Pregunta

Tengo un montón de archivos (episodios de TV, aunque eso es bastante arbitrario) que quiero verificar que coincidan con un esquema de organización/nombramiento específico.

Actualmente:Tengo tres matrices de expresiones regulares, una para nombres de archivos válidos, otra para archivos a los que les falta un nombre de episodio y otra para rutas válidas.

Luego, recorro cada expresión regular de nombre de archivo válido, si coincide, la agrego a un dictado "válido", si no, hago lo mismo con las expresiones regulares de nombre de archivo faltante, si coincide, lo agrego a un "no válido". "dict con un código de error (2: 'falta el nombre del episodio'), si no coincide con ninguno de los dos, se agrega como no válido con el código de error 'nombre mal formado'.

El código actual se puede encontrar. aquí

Quiero agregar una regla que verifique la presencia de un archivo carpeta.jpg en cada directorio, pero agregar esto haría que el código fuera sustancialmente más complicado en su estado actual.

¿Cómo podría escribir este sistema de una manera más ampliable?

Las reglas que necesita verificar serían...

  • El archivo tiene el formato Show Name - [01x23] - Episode Name.avi o Show Name - [01xSpecial02] - Special Name.avi o Show Name - [01xExtra01] - Extra Name.avi
  • Si el nombre del archivo está en el formato Show Name - [01x23].avi mostrarlo en la sección "nombre del episodio faltante" del resultado
  • La ruta debe tener el formato Show Name/season 2/the_file.avi (donde la temporada 2 debería ser el número de temporada correcto en el nombre del archivo)
  • cada Show Name/season 1/ la carpeta debe contener "carpeta.jpg"

.¿algunas ideas?Mientras intento comprobar los episodios de televisión, este concepto/código debería poder aplicarse a muchas cosas.

El único pensamiento que tuve fue una lista de dictados en el 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
}
¿Fue útil?

Solución

Quiero agregar una regla que verifique la presencia de un archivo de carpeta.jpg en cada directorio, pero para agregar esto haría que el código sea sustancialmente más desordenado en su estado actual.

Esto no tiene mala pinta.De hecho, su código actual lo hace muy bien y Sven también mencionó una buena manera de hacerlo:

  1. Obtener una lista de todos los archivos
  2. Busque archivos "requeridos"

Simplemente habrías agregado a tu diccionario una lista de archivos requeridos:

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

¿En cuanto a que existe una forma mejor/extensible de hacer esto?No estoy exactamente seguro.Realmente sólo se me ocurrió una forma de eliminar las "múltiples" expresiones regulares y aprovechar la idea de Sven de usar un delimitador.Entonces, mi estrategia sería definir un diccionario de la siguiente manera (y lo siento, no conozco la sintaxis de Python y me da un poco de pereza buscarla, pero debería tener sentido./regex/ es una abreviatura de una expresión regular):

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 el nombre del archivo según el delimitador.
  2. Revisa cada una de las partes.

Debido a que es una lista ordenada, puedes determinar qué partes faltan y si una sección no coincide con ningún patrón, está mal formada.Aquí el parts y patterns tienen una proporción de 1 a 1.Dos matrices en lugar de un diccionario imponen el orden.

Se pueden enumerar los archivos ignorados y requeridos.El . y .. Los archivos probablemente deberían ignorarse automáticamente.Se debe permitir al usuario ingresar "globs" que se puedan expandir mediante shell.Estoy pensando aquí en svn:ignore propiedades, pero el globbing es natural para enumerar archivos.

Aquí start_dir El valor predeterminado sería el directorio actual, pero si desea que un solo archivo ejecute pruebas automatizadas de varios directorios, esto sería útil.

El verdadero cabo suelto aquí es la plantilla de ruta y, en la misma línea, qué ruta se requiere para los "archivos válidos".Realmente no se me ocurría una idea sólida sin escribir una expresión regular grande y tomar grupos de ella...para construir una plantilla.Se parecía mucho a escribir una gramática del lenguaje TextMate.Pero eso empieza a desviarse de la facilidad de uso.El verdadero problema era que la plantilla de ruta no estaba compuesta de parts, lo cual tiene sentido pero agrega complejidad.

¿Está esta estrategia en sintonía con lo que estabas pensando?

Otros consejos

tal vez deberías adoptar el enfoque de establecer de forma predeterminada:"el nombre del archivo es correcto" y trabaje desde allí para refutar esa afirmación:

con el hecho de que solo permites nombres de archivos con:'nombre del programa', 'número de temporada x número de episodio' y 'nombre del episodio', sabes con certeza que estos elementos deben estar separados por un "-" (guión), por lo que debes tener 2 de ellos para que un nombre de archivo sea correcto. .
si eso funciona, puede usar su código para verificar que el nombre del programa coincida con el nombre del programa como se ve en la carpeta principal de los padres (supongo que no distingue entre mayúsculas y minúsculas), el número de temporada coincide con el valor numérico de la carpeta de los padres (con o sin un 0 adicional antepuesto).

Sin embargo, si no ve la cantidad correcta de guiones, sabrá instantáneamente que algo anda mal y se detendrá antes del resto de las pruebas, etc.

y por separado puedes comprobar si el archivo folder.jpg existe y tomar las acciones necesarias. o haga eso primero y filtre ese archivo del resto de los archivos en esa carpeta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top