Universidad de Costa Rica Facultad de Ingenieria Escuela de Ingenieria Electrica Programacion Bajo Plataformas Abiertas IE-0117 I CICLO 2012 Laboratorio 10 Sebastian Sotela Golcher B16455 1. 100 Muy bien! Aspectos generales En este laboratorio se aprendio a usar funciones de sistema. Al principio se utilizo el modulo subprocess pero se tuvo muchos problemas por lo que se opto por glob. Definitivamente la mas util de las funciones fue path.walk() del modulo os ya que define una recursion completa a traves de un directorio. Es bueno trabajar con archivos .txt ya que no presentan ninguna clase de problemas con codificacion por ejemplo. El modulo que mas se uso en esta asignacion fue el os. A continuacion se presenta lo que se hizo en cada laboratorio bien comentado. 2. Parte 1 # ! / u s r / b i n / python # −∗− coding : l a t i n −1 −∗− #Modulos ocupados en e l programa import math import sys # e s t e modulo s i r v e para e f e c t u a r f u n c i o n e s de sistema import os ####################################################################################### # d e f i n e un metodo que l e e una l i s t a de numeros y l a ordena de manera ascendente o #descendente def o r d e n a l i s t a s ( ) : #se abre , y s i no e x i s t e se crea , un a r c h i v o con e l nombre d e l segundo #argumento , para e s c r i b i r sobre e l datos = open ( sys . argv [ 1 ] , ’ r ’ ) # se d e f i n e l a opcion de ordenar l i s t a s como e l t e r c e r argumento opcion = sys . argv [ 2 ] # i n i c i a l i z a una l i s t a v a c i a lista = [] #se i t e r a a t r a v e s de l a s l i n e a s d e l a r c h i v o hasta que en e s t a s no se l e a nada while True : # devuelve e l v a l o r de una l i n e a y mueve l a p o s i c i o n d e l p u n t e r o elemento = datos . r e a d l i n e ( ) # s i l a l i n e a t i e n e a l g o e s c r i t o se agreg a l a l i s t a , ademas de # transformarlo a entero i f elemento : l i s t a . append ( i n t ( elemento ) ) # s i l a l i n e a no t i e n e nada se s a l e d e l c i c l o else : break Universidad de Costa Rica Facultad de Ingenieria Escuela de Ingenieria Electrica Programacion Bajo Plataformas Abiertas IE-0117 I CICLO 2012 Laboratorio 10 Sebastian Sotela Golcher B16455 # c i e r r el archivo datos . c l o s e ( ) #ordena l a l i s t a de manera ascendente l i s t a . sort () # S i l a opcion es ascendente se imprime l a l i s t a como e s t a i f opcion == ’ a ’ : return l i s t a # s i l a opcion es descendente se i n v i e r t e e l orden de l a l i s t a con l a # funcion reverse e l i f opcion == ’ d ’ : l i s t a . reverse ( ) return l i s t a # S i no se i n t r o d u c e un argumento v a l i d o se imprime un e r r o r en p a n t a l l a y # f i n a l i z a e l programa else : p r i n t " E r r o r : argumento i n v a l i d o \ n NOTA: E l t e r c e r argumento c o n t i e n e l a s opciones ’ a ’ para ascendente y ’ d ’ para descendente " sys . e x i t ( 1 ) # d e f i n e una f u n c i o n que crea un nuevo a r c h i v o con l a l i s t a ordenada def ArchivoOrdenado ( ) : # o b t i e n e l a s a l i d a de l a f u n c i o n a n t e r i o r listaordenada = ordenalistas ( ) #abre , o crea s i no e x i s t e , un a r c h i v o para e s c r i b i r sobre e l archivo_ordenado =open ( ’ l i s t a _ o r d e n a d a . t x t ’ , ’w ’ ) # i t e r a a t r a v e s de l a l i s t a ordenada for x in listaordenada : #se imprime en e l a r c h i v o cada elemento de l a l i s t a p r i n t >>archivo_ordenado , " %d \ n " %(x ) # cierra el archivo archivo_ordenado . c l o s e ( ) # imprime un mensaje de e x i t o p r i n t "Ha creado un a r c h i v o d e l c o n t e n i d o de %s ordenado de manera opcion = %s " %(sys . argv [ 1 ] , sys . argv [ 2 ] ) ################################################Programa P r i n c i p a l ################## #se deben i n t r o d u c i r 3 argumentos para que e l programa c o r r a i f l e n ( sys . argv ) ! = 3 : p r i n t " E r r o r : Debe i n t r o d u c i r 3 argumentos : \ n Uso c o r r e c t o : %s a r c h i v o opcion " %(sys . argv [ 0 ] ) sys . e x i t ( 1 ) # V e r i f i c a que se i n t r o d u z c a una r u t a e x i s t e n t e i f os . path . e x i s t s ( sys . argv [ 1 ] ) : # s i e l segundo argumento es un a r c h i v o se procede i f os . path . i s f i l e ( sys . argv [ 1 ] ) : #LLama a l a f u n c i o n con e s t e nombre ArchivoOrdenado ( ) # s i e l argumento no es un a r c h i v o se imprime un e r r o r Universidad de Costa Rica Facultad de Ingenieria Escuela de Ingenieria Electrica Programacion Bajo Plataformas Abiertas IE-0117 I CICLO 2012 Laboratorio 10 Sebastian Sotela Golcher B16455 else : p r i n t " E r r o r : %s no es un a r c h i v o " sys . e x i t ( 1 ) else : p r i n t " E r r o r : La r u t a s e l e c c i o n a d a no e x i s t e " sys . e x i t ( 1 ) 3. Parte 2 # ! / u s r / b i n / python # −∗− coding : l a t i n −1 −∗− #Modulos ocupados en e l programa import math import sys import os # g l o b es un modulo que me p e r m i t e l i s t a r e l c o n t e n i d o de un d i r e c t o t i o por ejemplo import g l o b ################################ Funciones ########################################### # d e f i n e una f u n c i o n que d e s p l i e g a l o s a r c h i v o s que son enlaces s i m b o l i c o s y h a c i a #adonde apuntan se d e f i n e None como v a l o r predeterminado , es d e c i r s i no se l e dan # parametros no hace nada def enlaces ( d i r e c t o r i o , a r c h i v o =None ) : # v e r i f i c a s i e l segundo argumento es un d i r e c t o r i o i f not os . path . i s d i r ( d i r e c t o r i o ) : p r i n t " E r r o r : e l segundo argumento no es un d i r e c t o r i o " #se o b t i e n e una l i s t a de todo elemento d e l d i r e c t o r i o # e l a s t e r i s c o s i m b o l i z a c u a l q u i e r cosa contenido = glob . glob ( d i r e c t o r i o +" / ∗ " ) # s i se i n t r o d u j o l a v a r i a b l e a r c h i v o : i f archivo : #se abre o se crea un a r c h i v o para e s c r i b i r sobre e l datos = open ( a r c h i v o , ’w ’ ) #se imprime en e l a r c h i v o e l t i t u l o de l a l i s t a p r i n t >> datos , " L i s t a de elementos con enlace s i m b o l i c o en e l directorio " , directorio # s i no se i n t r o d u j o l a v a r i a b l e a r c h i v o se imprime en p a n t a l l a e l t i t u l o de l a #lista else : p r i n t " L i s t a de elementos con enlace s i m b o l i c o en e l d i r e c t o r i o " , directorio # usar l a combinacion de range y l e n es u t i l para no usar contadores f o r n i n range ( l e n ( c o n t e n i d o ) ) : # e s t a f u n c i o n de os me p e r m i t e v e r i f i c a r s i e l a r c h i v o es un enlace #simbolico i f os . path . i s l i n k ( c o n t e n i d o [ n ] ) : # e s t a f u n c i o n de os o b t i e n e l a d i r e c c i o n en l a que apunta e l #link Universidad de Costa Rica Facultad de Ingenieria Escuela de Ingenieria Electrica Programacion Bajo Plataformas Abiertas IE-0117 I CICLO 2012 Laboratorio 10 Sebastian Sotela Golcher B16455 enlace = os . r e a d l i n k ( c o n t e n i d o [ n ] ) # s i se i n t r o d u j o l a v a r i a b l e se imprime en e l a r c h i v o i f archivo : p r i n t >>datos , c o n t e n i d o [ n ] , "−−−>" , enlace # s i no se i n t r o d u j o l a v a r i a b l e se imprime e l c o n t e n i d o en # consola else : p r i n t c o n t e n i d o [ n ] , "−−−>" , enlace # para e l caso d e l a r c h i v o se c i e r r a e s t e y se imprime una n o t i f i c a c i o n de creacion i f archivo : datos . c l o s e ( ) p r i n t "Ha creado un a r c h i v o con l a l i s t a de enlaces s i m b o l i c o s d e l directorio " ########################################Programa P r i n c i p a l ######################### #se o b t i e n e l a r u t a a b s o l u t a d e l segundo argumento i n t r o d u c i d o para e l uso de # f u n c i o n e s d e l modulo os D i r e c t o r i o = os . path . abspath ( sys . argv [ 1 ] ) # s i se u t i l i z a n 2 argumentos l a f u n c i o n enlaces r e c i b e 1 i f l e n ( sys . argv ) == 2 : enlaces ( D i r e c t o r i o ) # s i se u t i l i z a n 3 argumentos l a f u n c i o n enlaces r e c i b e 2 i f l e n ( sys . argv ) == 3 : enlaces ( D i r e c t o r i o , sys . argv [ 2 ] ) # s i no se r e c i b e n l a c a n t i d a d de argumentos debida se imprime un e r r o r y f i n a l i z a # e l programa else : p r i n t " E r r o r : Se deben i n t r o d u c i r dos o t r e s argumentos \ nUso c o r r e c t o : %s d i r e c t o r i o a r c h i v o ( o p c i o n a l ) " %(sys . argv [ 0 ] ) 4. Parte 3 # ! / u s r / b i n / python # −∗− coding : l a t i n −1 −∗− #Modulos ocupados en e l programa import math import sys import os ################################ Funciones #################################################### # d e f i n e una f u n c i o n que d e s p l i e g a e l c o n t e n i d o de todos l o s a r c h i v o s de un # d i r e c t o r i o de manera r e c u r s i v a , imprime su r e s p e c t i v o tamano y e l tamano # t o t a l del d i r e c t o r i o def c o n t e n i d o D i r e c t o r i o ( D i r e c t o r i o ) : # v e r i f i c a que e l argumento sea un d i r e c t o r i o i f not os . path . i s d i r ( D i r e c t o r i o ) : Universidad de Costa Rica Facultad de Ingenieria Escuela de Ingenieria Electrica Programacion Bajo Plataformas Abiertas IE-0117 I CICLO 2012 Laboratorio 10 Sebastian Sotela Golcher B16455 p r i n t " E r r o r : e l segundo argumento no es un d i r e c t o r i o \ n " sys . e x i t ( 1 ) #se i n i c i a l i z a e l tamano t o t a l tamanototal = 0 # t i t u l o del l i s t a d o p r i n t " Contenido t o t a l d e l d i r e c t o r i o " , D i r e c t o r i o # l a f u n c i o n walk me r e c o r r e todos l o s s u b d i r e c t o r i o s y a r c h i v o s f o r a c t u a l , d i r e c t o r i o s , a r c h i v o s i n os . walk ( D i r e c t o r i o ) : #se i t e r a a t r a v e s de todos l o s a r c h i v o s f o r arch i n a r c h i v o s : # l a f u n c i o n j o i n me p e r m i t e o b t e n e r r u t a s a b s o l u t a s # uniendo l a d i r e c c i o n d e l d i r e c t o r i o con e l nombre d e l #archivo r u t a = os . path . j o i n ( a c t u a l , arch ) # l a f u n c i o n g e t s i z e me da e l tamano de cada a r c h i v o tamano = os . path . g e t s i z e ( r u t a ) #cada uno se suma a l tamano t o t a l t a m a n o t o t a l += tamano #cada uno se imprime de l a s i g u i e n t e manera p r i n t " A r c h i v o : " , arch , "−−−>Tamano : " , tamano , " b y t e s " # a l f i n a l se imprime e l t o t a l p r i n t " E l c o n t e n i d o d e l d i r e c t o r i o t i e n e un tamano de : " , t a m a n o t o t a l , " bytes " ###########################Programa P r i n c i p a l ###################################### # v e r i f i c a que se i n t r o d u z c a n 2 argumentos i f l e n ( sys . argv ) ! = 2 : p r i n t " E r r o r : Se deben i n t r o d u c i r dos argumentos \ nUso c o r r e c t o : %s d i r e c t o r i o " %(sys . argv [ 0 ] ) sys . e x i t ( 1 ) #se o b t i e n e l a r u t a a b s o l u t a d e l argumento para e v i t a r problemas D i r e c t o r i o = os . path . abspath ( sys . argv [ 1 ] ) #Llama a l a f u n c i o n d e f i n i d previamente contenidoDirectorio ( Directorio )