Ejercicios « Manejo de ficheros¶ Ejercicio 1¶ En este ejercicio deberás crear un script llamado personas.py que lea los datos de un fichero de texto, que transforme cada fila en un diccionario y lo añada a una lista llamada personas. Luego rocorre las personas de la lista y paracada una muestra de forma amigable todos sus campos. El fichero de texto se denominará personas.txt y tendrá el siguiente contenido en texto plano (créalo previamente): 1;Carlos;Pérez;05/01/1989 2;Manuel;Heredia;26/12/1973 3;Rosa;Campos;12/06/1961 4;David;García;25/07/2006 Los campos del diccionario serán por orden: id, nombre, apellido y nacimiento. Importante Si quieres leer un fichero que no se ha escrito directamente con Python, entonces es posible que encuentres errores de codificación al mostrar algunos caracteres. Asegúrate de indicar la codificación del fichero manualmente durante la apertura como argumento en el open, por ejemplo con UTF-8: open(..., encoding="utf8") Solución¶ Note personas.py from io import open fichero = open('personas.txt','r', encoding="utf8") lineas = fichero.readlines() fichero.close() personas = [] for linea in lineas: # Borramos los saltos de línea y separamos campos = linea.replace("\n", "").split(";") persona = {"id":campos[0], "nombre":campos[1], "apellido":campos[2], "nacimiento":campos[3]} personas.append(persona) for p in personas: print("(id={}) {} {} => {} ".format( p['id'], p['nombre'], p['apellido'], p['nacimiento']) ) Resultado (id=1) Cárlos Peralta => 05/01/1989 (id=2) Manuel Heredia => 26/12/1973 (id=3) Rosa Campos => 12/06/1961 (id=4) David García => 25/07/2006 Ejercicio 2¶ En este ejercicio deberás crear un script llamado contador.py que realice varias tareas sobre un fichero llamado contador.txt que almacenará un contador de visitas (será un número): Nuestro script trabajará sobre el fichero contador.txt. Si el fichero no existe o está vacío lo crearemos con el número 0. Si existe simplemente leeremos el valor del contador. Luego a partir de un argumento: Si se envía el argumento inc, se incrementará el contador en uno y se mostrará por pantalla. Si se envía el argumento dec, se decrementará el contador en uno y se mostrará por pantalla. Si no se envía ningún argumento (o algo que no sea inc o dec), se mostrará el valor del contador por pantalla. Finalmente guardará de nuevo el valor del contador de nuevo en el fichero. Utiliza excepciones si crees que es necesario, puedes mostrar el mensaje: Error: Fichero corrupto. Solución¶ Note contador.py from io import open import sys fichero = open("contador.txt", "a+") fichero.seek(0) contenido = fichero.readline() if len(contenido) == 0: contenido = "0" fichero.write(contenido) fichero.close() # Vamos a intentar transformar el texto a un número try: contador = int(contenido) # En función de lo que el usuario quiera... if len(sys.argv) == 2: if sys.argv[1] == "inc": contador += 1 elif sys.argv[1] == "dec": contador -= 1 print(contador) # Finalmente volvemos a escribir los cambios en el fichero fichero = open("contador.txt", "w") fichero.write( str(contador) ) fichero.close() except: print("Error: Fichero corrupto.") Ejecución python contador.py inc python contador.py inc python contador.py dec python contador.py inc Resultado 1 2 1 2 Ejercicio 3¶ Utilizando como base el ejercicio de los personajes que hicimos, en este ejercicio tendrás que crear un gestor de personajes gestor.py para añadir y borrar la información de los siguientes personajes: Vida Ataque Defensa Alcance Caballero 4 2 4 2 Guerrero 2 4 2 4 Arquero 2 4 1 8 Deberás hacer uso del módulo pickle y todos los cambios que realices se irán guardando en un fichero binario personajes.pckl, por lo que aunque cerremos el programa los datos persistirán. Crea dos clases, una Personaje y otra Gestor. La clase Personaje deberá permitir crear un personaje con el nombre (que será la clase), y sus propiedades de vida, ataque, defensa y alcance (que deben ser números enteros mayor que cero obligatoriamente). Por otro lado la clase Gestor deberá incorporar todos los métodos necesarios para añadir personajes, mostrarlos y borrarlos (a partir de su nombre por ejemplo, tendrás que pensar una forma de hacerlo), además de los métodos esenciales para guardar los cambios en el fichero personajes.pckl que se deberían ejecutar automáticamente. En caso de que el personaje ya exista en el Gestor entonces no se creará. Una vez lo tengas listo realiza las siguientes prueba en tu código: Crea los tres personajes de la tabla anterior y añádelos al Gestor. Muestra los personajes del Gestor. Borra al Arquero. Muestra de nuevo el Gestor. Sugerencia El ejemplo con pickle que realizamos anteriormente puede servirte como base. Solución¶ Note gestor.py from io import open import pickle class Personaje: def __init__(self, nombre, vida, ataque, defensa, alcance): self.nombre = nombre self.vida = vida self.ataque = ataque self.defensa = defensa self.alcance = alcance def __str__(self): return "{} => {} vida, {} ataque, {} defensa, {} alcance".format( self.nombre, self.vida, self.ataque, self.defensa, self.alcance) class Gestor: personajes = [] # Constructor de clase def __init__(self): self.cargar() def agregar(self, p): for pTemp in self.personajes: if pTemp.nombre == p.nombre: return self.personajes.append(p) self.guardar() def borrar(self, nombre): for pTemp in self.personajes: if pTemp.nombre == nombre: self.personajes.remove(pTemp) self.guardar() print("\nPersonaje {} borrado".format(nombre)) return def mostrar(self): if len(self.personajes) == 0: print("El gestor está vacío") return for p in self.personajes: print(p) def cargar(self): fichero = open('personajes.pckl', 'ab+') fichero.seek(0) try: self.personajes = pickle.load(fichero) except: # print("El fichero está vacío") pass finally: fichero.close() print("Se han cargado {} personajes".format( len(self.personajes))) def guardar(self): fichero = open('personajes.pckl', 'wb') pickle.dump(self.personajes, fichero) fichero.close() # Realizamos las pruebas G = Gestor() G.agregar( Personaje("Caballero",4,2,4,2) ) G.agregar( Personaje("Guerrero",2,4,2,4) ) G.agregar( Personaje("Arquero",2,4,1,8) ) G.mostrar() G.borrar("Arquero") G.mostrar() Resultado Se han cargado 2 personajes Caballero => 4 vida, 2 ataque, 4 defensa, 2 alcance Guerrero => 2 vida, 4 ataque, 2 defensa, 4 alcance Arquero => 2 vida, 4 ataque, 1 defensa, 8 alcance Personaje Arquero borrado Caballero => 4 vida, 2 ataque, 4 defensa, 2 alcance Guerrero => 2 vida, 4 ataque, 2 defensa, 4 alcance Última edición: 3 de Octubre de 2018