Saltar a contenido

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:

VidaAtaqueDefensaAlcance
Caballero4242
Guerrero2424
Arquero2418

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