Saltar a contenido
 No os perd谩is mi futuro contenido, seguidme en y Youtube 馃榿

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

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']) )
(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

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.")
python contador.py inc
python contador.py inc
python contador.py dec
python contador.py inc
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

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()
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