Laboratorio 10. Entrada y Salida / Funciones del sistema

Anuncio
100
UNIVERSIDAD DE COSTA RICA
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA ELÉCTRICA
PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117
LABORATORIO 10
I CICLO 2012
Laboratorio 10. Entrada y Salida / Funciones del sistema
Estudiante: José David Vargas Quirós
Carné: B16945
1. Se creó un programa que recibe como argumento el nombre de un archivo que debe contener números
enteros, uno por línea. El programa lee el archivo y crea un nuevo archivo con los mismos números en
orden ascendiente o descendiente según se especifique en el segundo parámetro. Para leer las líneas y
almacenarlas en una lista se usó la función readlines(). El código del programa (archivo orden.py) es el
siguiente, con sus comentarios:
# ! / u s r / b i n / python
# −*− coding : l a t i n −1 −*−
i m p o r t math
i m p o r t sys
# S i l a c a n t i d a d de argumentos no es c o r r e c t a se muestra un e r r o r
i f l e n ( sys . argv ) ! = 3 :
p r i n t "Número de argumentos i n c o r r e c t o "
p r i n t " Uso : %s a r c h i v o E n t r a d a orden " % ( sys . argv [ 0 ] )
p r i n t " Orden : a−>Ascendiente d−>Descendiente "
sys . e x i t ( 1 )
nombreArchivo = sys . argv [ 1 ]
orden = sys . argv [ 2 ]
#Se abre e l a r c h i v o que se va a ordenar
a r c h i v o L e c t u r a = open(" %s " % ( nombreArchivo ) , ’ r ’ )
#Cada l í nea d e l a r c h i v o se c o n v i e r t e en un elemento de una l i s t a , con l a f u n c i ó
n readlines ( )
l i s t a = archivoLectura . readlines ( )
#Los elementos de l a l i s t a se pasan a t i p o de dato e n t e r o
cont = 0
while cont < len ( l i s t a ) :
l i s t a [ cont ] = i n t ( l i s t a [ cont ] )
c o n t += 1
#Se ordena l a l i s t a . S i se e s p e c i f i c ó un orden descendiente entonces l a l i s t a
se i n v i e r t e . Para c u a l q u i e r o t r o v a l o r , por d e f e c t o e l orden es a s c e n d i e n t e
l i s t a . sort ()
i f orden == " d " :
UNIVERSIDAD DE COSTA RICA
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA ELÉCTRICA
PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117
LABORATORIO 10
I CICLO 2012
l i s t a . reverse ( )
#Se abre e l a r c h i v o " l i s t a O r d e n a d a . t x t " donde se e s c r i b i r á l a l i s t a de e n t e r o s
ordenada
a r c h i v o E s c r i t u r a = open ( " l i s t a O r d e n a d a . t x t " , "w " )
#Se i t e r a por l a l i s t a e s c r i b i e n d o una l í nea a l a vez
f o r numero i n l i s t a :
a r c h i v o E s c r i t u r a . w r i t e (" %d \ n " % ( numero ) )
p r i n t " L i s t a ordenada en e l a r c h i v o l i s t a O r d e n a d a . t x t "
2. Se escribió un programa que recibe el nombre de un directorio con el fin de obtener los enlaces simbólicos
que hay en él. Con la función glob.glob() se obtiene todo el contenido del directorio y la funcion os.path.islink()
revisa si cada elemento del directorio es un enlace simbólico o no. El resultado puede mostrarse en pantalla
o escribirse a un archivo especificado como segundo parámetro. El código del archivo simbolicos.py es el
siguiente:
# ! / u s r / b i n / python
# −*− coding : l a t i n −1 −*−
i m p o r t sys
#Se i m p o r t a n g l o b y os para usar l a s f u n c i o n e s g l o b . g l o b ( ) , os . path . i s l i n k ( ) y
os . r e a d l i n k ( )
import glob
i m p o r t os
# S i l a c a n t i d a d de argumentos no es c o r r e c t a se muestra un e r r o r
i f ( l e n ( sys . argv ) > 3 ) o r ( l e n ( sys . argv ) == 1 ) :
p r i n t "Número de argumentos i n c o r r e c t o "
p r i n t " Uso : %s d i r e c t o r i o a r c h i v o S a l i d a " % ( sys . argv [ 0 ] )
sys . e x i t ( 1 )
# E l p r i m e r argumento es e l d i r e c t o r i o donde se buscar án l o s enlaces simbó l i c o s
d i r e c t o r i o = sys . argv [ 1 ]
# S i se e s p e c i f i c ó un a r c h i v o como segundo par ámetro , se abre o crea e l mismo .
Por d e f e c t o no se e s c r i b e a un a r c h i v o
e s c r i b i r A r c h i v o = False
i f l e n ( sys . argv ) == 3 :
e s c r i b i r A r c h i v o = True
a r c h i v o E s c r i t u r a = open ( sys . argv [ 2 ] , ’w ’ )
#La f u n c i ón g l o b . g l o b ( ) devuelve todos l o s a r c h i v o s , c a r p e t a s y enlaces simbó
l i c o s del d i r e c t o r i o
l i s t a = g l o b . g l o b (" %s / * " % ( d i r e c t o r i o ) )
#Se i t e r a por l o s elementos de l a l i s t a
f o r elemento i n l i s t a :
#Se prueba s i cada elemento es un enlace simbó l i c o con os . path . i s l i n k ( )
i f os . path . i s l i n k ( elemento ) :
UNIVERSIDAD DE COSTA RICA
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA ELÉCTRICA
PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117
LABORATORIO 10
I CICLO 2012
#os . r e a d l i n k ( ) da l a d i r e c c i ón a l a que apunta e l enlace
enlace = os . r e a d l i n k ( elemento )
# S i se e s p e c i f i c ó un a r c h i v o se e s c r i b e a l mismo , s i n o se imprime en
p a n t a l l a e l nombre d e l v í n c u l o y l a d i r e c c i ón a l a que apunta
i f e s c r i b i r A r c h i v o == True :
a r c h i v o E s c r i t u r a . w r i t e (" %s => %s \ n " % ( elemento , enlace ) )
else :
p r i n t " %s => %s " % ( elemento , enlace )
3. Se escribió un programa que recibe el nombre de un directorio con el fin de imprimir todos los archivos que
contiene y el tamaño de cada uno. Además de los archivos el programa imprime el nombre de las carpetas
usando indentación con guiones para mostrar la estructura jerárquica de los directorios. Al final se muestra el
tamaño total del directorio "superior"que especificó el usuario. El contenido del archivo ls.py es el siguiente:
# ! / u s r / b i n / python
# −*− coding : l a t i n −1 −*−
i m p o r t sys
#Se i m p o r t a n g l o b y os para usar l a s f u n c i o n e s g l o b . g l o b ( ) , os . path . i s f i l e ( ) y
os . path . i s d i r ( )
import glob
i m p o r t os
# Esta f u n c i ón c a l c u l a e l número de guiones para i d e n t a r e l nombre d e l a r c h i v o
de acuerdo a l a p o s i c i ón d e l á r b o l de d i r e c t o r i o donde se encuentra .
d e f guiones ( l v l ) :
guiones = " "
cont = 0
w h i l e c o n t <= l v l :
guiones += "−−"
c o n t += 1
r e t u r n guiones
# Esta f u n c i ón r e c u r s i v a imprime e l á r b o l de d i r e c t o r i o s de una c a r p e t a con l o s
a r c h i v o s c o n t e n i d o s y e l tamano de cada uno . path i n d i c a l a r u t a de l a
c a r p e t a y l v l e l n i v e l en e l á r b o l de d i r e c t o r i o s . l v l 0 es l a c a r p e t a que
pasa e l u s u a r i o , y e l n i v e l aumenta conforme l a r e c u r s i ón se a d e n t r a en l a s
c a r p e t a s c o n t e n i d a s . Se usa para m o s t r a r l a i n d e n t a c i ón adecuada .
d e f d i r S i z e ( path , l v l ) :
#La v a r i a b l e s i z e se d e b i ó d e f i n i r como g l o b a l para s i m p l i f i c a r e l cá l c u l o
d e l tamano t o t a l d e l d i r e c t o r i o .
global size
#Con g l o b . g l o b ( ) se o b t i e n e n todos l o s a r c h i v o s , enlaces y c a r p e t a s d e l
d i r e c t o r i o path en una l i s t a
l i s t a = g l o b . g l o b (" %s / * " % ( path ) )
#La l i s t a o b t e n i d a no t i e n e un orden d e f i n i d o . Entonces se r e c o r r e l a l i s t a
para s e p a r a r l o s a r c h i v o s de l o s d i r e c t o r i o s en dos l i s t a s a p a r t e con e l
f i n de que a l d e s p l e g a r e l á r b o l aparezcan p r i m e r o l o s a r c h i v o s en orden
a l f a b é t i c o y después l o s d i r e c t o r i o s tambi én en orden a l f a b é t i c o con sus
subdirectorios / archivos .
UNIVERSIDAD DE COSTA RICA
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA ELÉCTRICA
PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117
LABORATORIO 10
I CICLO 2012
listaArchivos = [ ]
listaDirectorios = []
f o r elemento i n l i s t a :
i f os . path . i s f i l e ( elemento ) :
l i s t a A r c h i v o s . append ( elemento )
e l i f os . path . i s d i r ( elemento ) :
l i s t a D i r e c t o r i o s . append ( elemento )
#Se ordenan l o s v e c t o r e s como cadenas
listaArchivos . sort ()
listaDirectorios . sort ()
#Se vuelven a u n i r l a s l i s t a s para o b t e n e r una l i s t a ordenada
l i s t a = listaArchivos + listaDirectorios
#Ahora se v u e l v e a r e c o r r e r l a l i s t a para i m p r i m i r cada elemento
f o r elemento i n l i s t a :
# S i e l elemento es un a r c h i v o se imprime e l nombre , s i n l a r u t a completa ,
seguido d e l tamano d e l a r c h i v o , con l o s guiones de i n d e n t a c i ón
c o r r e s p o n d i e n t e s para dar l a a p a r i e n c i a de un á r b o l de d i r e c t o r i o s .
i f os . path . i s f i l e ( elemento ) :
f i l e S i z e = os . path . g e t s i z e ( elemento )
p r i n t " %s %s | %s b y t e s " % ( guiones ( l v l ) , os . path . basename ( elemento ) ,
fileSize )
#Se incrementa l a v a r i a b l e g l o b a l con e l tamano d e l a r c h i v o
s i z e += i n t ( f i l e S i z e )
# S i e l elemento es un d i r e c t o r i o se imprime solamente e l nombre d e l
d i r e c t o r i o , con l o s guiones de i n d e n t a c i ón c o r r e s p o n d i e n t e s y se hace
l a llamada r e c u r s i v a a e s t a misma f u n c i ón para i m p r i m i r e l c o n t e n i d o
del d i r e c t o r i o
e l i f os . path . i s d i r ( elemento ) :
p r i n t " %s %s " % ( guiones ( l v l ) , os . path . basename ( elemento ) )
d i r S i z e ( elemento , l v l +1)
# S i l a c a n t i d a d de argumentos no es c o r r e c t a se muestra un e r r o r
i f l e n ( sys . argv ) ! = 2 :
p r i n t "Número de argumentos i n c o r r e c t o "
p r i n t " Uso : %s d i r e c t o r i o " % ( sys . argv [ 0 ] )
sys . e x i t ( 1 )
# E l argumento es e l d i r e c t o r i o donde se m o s t r a r án l o s a r c h i v o s . S i e l
d i r e c t o r i o no e x i s t e se muestra un e r r o r
d i r e c t o r i o = sys . argv [ 1 ]
i f n o t os . path . i s d i r ( d i r e c t o r i o ) :
p r i n t " E l d i r e c t o r i o no e x i s t e "
sys . e x i t ( 1 )
UNIVERSIDAD DE COSTA RICA
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA ELÉCTRICA
PROGRAMACIÓN BAJO PLATAFORMAS ABIERTAS IE-0117
LABORATORIO 10
I CICLO 2012
#La v a r i a b l e g l o b a l s i z e se i n i c i a l i z a en 0
size = 0
#Se hace l a llamada a l a f u n c i ón r e c u r s i v a , i n i c i a l m e n t e con e l d i r e c t o r i o que
e s p e c i f i c ó e l u s u a r i o y un n i v e l de 0
d i r S i z e ( d i r e c t o r i o , 0)
#Se imprime e l tamano t o t a l de l a c a r p e t a en bytes , almacenado en l a v a r i a b l e
global size .
p r i n t " La c a r p e t a mide %s b y t e s " % ( s i z e )
Descargar