Entradas populares

domingo, 27 de abril de 2014

crear y parsear textos y direcciones de fichero con python

Muchas veces tenemos que crear cadenas de texto a partir de variables que tenemos, estas cadenas de texto pueden ser  lineas en un archivo, expresiones o direcciones de archivos por ejemplo, muchas veces el modo normal de hacerlo es crear un pattern para esa linea y reemplazar las etiquetas por variables, por ejemplo, si queremos crear en un archivo para configurar las variables de entorno podemos tener una clase para crear un pattern parecido a 

self.pattern ='export <ENVVARNAME>=<ENVVARVALUE>'

y reemplazamos las etiquetas por el valor que nos interese, por ejemplo

self.ENVVARNAME='MAYA_VERSION'
self.ENVVARVALUE='2014'

line=self.solvePattern()

si tenemos el método solvePattern que nos busque todas las variables que hay en la clase y si esta en el patter nos la sustituya por su valor, al final tendremos la linea como la queremos

export MAYA_VERSION=2014

esto es bastante fácil de hacer, pero que pasa si queremos hacer al reves?? si lo que queremos es parsear ese archivo de configuración para ver que variables de entorno setea?

pues para ello contamos con la librería re, para comparar cadenas de texto con expresiones. Nosotros ya tenemos el patter de la linea de texto, y lo que queremos es convertir ese pattern en la expresión con la que lo queremos comparar las lineas del archivo. para ello realizamos dos sustituciones en la cadena de texto

tempExpresion=self.ppatern.replace('<','(?p<')
self.expression=tempExpresion.replace('>','>)')

con esto nuestro texto sera una expresion como esta

export (?p<ENVVARNAME>)=(?p<ENVVARVALUE>)

y si lo utilizamos en una comparacion en el modulo re

import re

outDict=re.match(currentLine,self.expression)

si tenemos una coincidencia outDict sera no None y nos devolverá un diccionario con dos keys, una sera ENVVARNAME y otra ENVVARVALUE y sus correspondientes valores

Esto que aqui parece algo interesante pero no muy util en principio, cuando lo aplicamos a los archivos nos encontramos que nos ofrece unas oportunidades enormes para buscar y navegar por los archivos que nos interesen y conseguir los datos que nos interesan de ese fichero, es decir, podemos hacer consultas y filtrar resultados como si de una base de datos se tratase. Para ello lo que tenemos que hacer es que el archivo sea creado a partir de un patter que nos defina la dirección del archivo, estilo

/<projecto>/<secuencia>/<plano>/modelado/<personaje>/v<version>/<formato>/<personaje>_v<version>.<formato>

con esto, navegando recursivamente cada nivel de las carpetas y comparandolas con el mismo nivel del pattern podemos conseguir todos los datos de cada archivo en forma de diccionario, con ello tenemos una lista de diccionarios que cada uno nos da informacion de un archivo, como si fuese una base de datos

Pero que pasa si queremos un(os) archivos en concreto?, por ejemplo, queremos todas las versiones del personaje "principal", pues aplicamos la primera parte de lo que hemos hablado hoy, solucionamos el pattern con los valores que tenemos, por lo tanto si seteamos el valor personaje a "principal" y lo reemplazamos en el pattern este sera 
  

/<projecto>/<secuencia>/<plano>/modelado/principal/v<version>/<formato>/principal_v<version>.<formato>

con lo que solo seran encontrados los archivos que coincidan en ese pattern que seran solo las versiones que hay de ese archivo  en los distintos planos


de este modo, el mismo formato que utilizamos para la creacion de las direcciones de los archivos nos vale tambien para hacer consultas a los directorios como si fuese una base de datos










1 comentario:

  1. Hola! quisiera empezar de cero de manera autodidacta, qué camino me recomiendas, académicamente?

    ResponderEliminar