Ejercicio 3

Escribir un programa para gestionar las citas de una consulta médica. La base de datos de citas debe estar en un fichero de nombre citas.csv. Cada cita contendrá los campos dni, mes, dia, hora y especialidad. No es necesario que la primera fila del csv contenga los nombres de los campos. El programa debe incluir las siguientes funciones:

  1. Una función que permita generar el fichero y añadir una cita a la base de datos.
  2. Una función que reciba un dni y devuelva una lista con las citas de ese paciente.
  3. Una función para eliminar las citas anteriores a una fecha dada.

Solución 1


In [1]:
# Ruta del fichero de citas.
fichero = 'citas.csv'

def citas(fichero=fichero):
    ''' Función que muestra por pantalla el contenido del fichero de citas.
    
    Parámetros:
        - fichero: Es una cadena con la ruta del fichero de citas.
    '''

    try:
        # Intentamos abrir el fichero de citas en modo lectura.
        f = open(fichero, mode='r')
    except FileNotFoundError:
        # Si no existe el fichero, controlamos la excepción mostrando por pantalla un mensaje informando de que el fichero no existe.
        print('El fichero no existe.')
    else:
        # Si el fichero existe y se puede abrir mostramos por pantalla una lista con sus líneas (cada línea corresponde a una cita).
        print(f.readlines())
        # Cerramos el fichero.
        f.close()
    return

# Apartado 1

def añadir_cita(dni, mes, dia, hora, especialidad, fichero = fichero):
    ''' Función que añade una cita al fichero de citas.

    Parámetros:
        - dni: Es una cadena con el dni del paciente.
        - mes: Es una cadena con el número de mes.
        - dia: Es una cadena con el día.
        - hora: Es una cadena con la hora en formato hh:mm.
        - especialidad: Es una cadena con la especialidad de la cita.
        - fichero: Es una cadena con la ruta del fichero de citas.
    '''

    try:
        # Intentamos abrir el fichero de citas en modo añadir.
        f = open(fichero, mode = 'a')
    except FileNotFoundError:
        # Si no existe el fichero, controlamos la excepción mostrando por pantalla un mensaje informando de que el fichero no existe.
        print('El fichero no existe.')
    else:
        # Si el fichero existe y se puede abrir añadimos al final del fichero una línea con la concatenación del dni, el mes, el día, la hora y la especialidad separados por comas.
        f.write(dni + ',' + mes + ',' + dia + ',' + hora + ',' + especialidad + '\n')
        # Cerramos el fichero.
        f.close()
    return

# Ejemplo
añadir_cita('01234567', '02', '05', '10:30', 'Cardiología')
añadir_cita('12345678', '04', '18', '12:00', 'Ginecología')
añadir_cita('01234567', '06', '20', '16:30', 'Cardiología')
añadir_cita('12345678', '03', '16', '9:30', 'Dermatología')
citas()


['01234567,02,05,10:30,Cardiología\n', '12345678,04,18,12:00,Ginecología\n', '01234567,06,20,16:30,Cardiología\n', '12345678,03,16,9:30,Dermatología\n']

In [3]:
# Apartado 2

def buscar_citas(dni, fichero = fichero):
    ''' Función que busca las citas de un paciente en el fichero de citas.

    Parámetros:
        - dni: Es una cadena con el dni del paciente.
        - fichero: Es una cadena con la ruta del fichero de citas.
    Devuelve: Una lista con las citas del paciente con el dni dado.
    '''
    try:
        # Intentamos abrir el fichero de citas en modo lectura.
        f = open(fichero, mode = 'r')
    except FileNotFoundError:
        # Si no existe el fichero, controlamos la excepción mostrando por pantalla un mensaje informando de que el fichero no existe.
        print('El fichero no existe.')
        return
    else:
        # Si el fichero existe y se puede abrir, leemos todas las líneas y las guardamos en una lista. Cada línea corresponde a una cita.
        citas = f.readlines()
        # Cerramos el fichero.
        f.close()
        # Filtramos la lista de citas para quedarnos con las del dni dado y devolvemos la lista filtrada. Para ello dividimos cada línea usando como separador de campos la coma y accedemos a la primera posición de la lista generada para obtener el dni de la cita.
        return [cita for cita in citas if cita.split(',')[0] == dni]

# Ejemplo
print(buscar_citas('12345678'))


['12345678,04,18,12:00,Ginecología\n', '12345678,03,16,9:30,Dermatología\n']

In [4]:
# Apartado 3

def eliminar_citas(mes, dia, fichero = fichero):
    ''' Función que elimina del fichero de citas las citas anteriores a una fecha dada.

    Parámetros:
        - mes: Es una cadena con el número de mes.
        - dia: Es una cadena con el día.
        - fichero: Es una cadena con la ruta del fichero de citas.
    '''
    try:
        # Intentamos abrir el fichero de citas en modo lectura.
        f = open(fichero, mode = 'r')
    except FileNotFoundError:
        # Si no existe el fichero, controlamos la excepción mostrando por pantalla un mensaje informando de que el fichero no existe.
        print('El fichero no existe.')
    else:
        # Si el fichero existe y se puede abrir, leemos todas las líneas y las guardamos en una lista. Cada línea corresponde a una cita.
        citas = f.readlines()
        # Cerramos el fichero.
        f.close()
        # Abrimos de nuevo el fichero en modo escritura (se elimina sus contenido).
        f = open(fichero, mode='w')
        # Bucle para recorrer las citas
        for cita in citas:
            # Dividimos la línea de cada cita usando como separador de campos la coma y concatenamos el segundo y tercer elementos de la lista resultantes que corresponden al mes y el día.
            fecha = ''.join(cita.split(',')[1:3])
            # Condicional para ver si la fecha de la cita es posteror a la fecha indicada.
            if fecha >= mes + dia:
                # Si la cita tiene una fecha posterior a la fecha indicada la escribimos en una nueva línea del fichero. 
                f.write(cita)
        # Cerramos el fichero.
        f.close()
    return

# Ejemplo
eliminar_citas('04', '01')
citas()


['12345678,04,18,12:00,Ginecología\n', '01234567,06,20,16:30,Cardiología\n']