ASIX-M3-UF3-A2.1- Solucions Exercicis fitxers de text

De wikiserver
Dreceres ràpides: navegació, cerca

1. Fes un programa que crei un diccionari en les dades dels empleats del fitxer de text empleats.txt. Y a continuació, el recorri mostrant les seves dades.

2. Per aquest exercici, crea prèviament un fitxer de text, que contingui només un número. Fes un mètode que pugui rebre 0, 1 o 2 paràmetres.

import sys

print("Un programa con parámetros.\n")

file = "UF3-A2.1-02.txt"

# Obtener una lista de argumentos (el primer argumento es el nombre del propio script, no hace falta)
args = sys.argv[1:]

# Contar el número de argumentos
num_args = len(args)

# Abrir fichero para escribir
fichero = open(file, "r+")
# Leer primer linea
primera_linea = fichero.readline()
# Volver a principio del fichero
fichero.seek(0)
try:
    numero = int(primera_linea)
except ValueError:
    print("La primera línea del fichero no contiene ningún número.")
    exit()

# Procesar el resultado según los argumentos
if num_args == 0:
    # Si no se dan argumentos
    print(f"En el archivo {file} hay un número: {numero}.")
elif num_args == 1:
    # Si solo se da 1 argumento
    if args[0] == "inc":
        print(f"El valor aumentado es ahora: {numero + 1}")
        fichero.writelines(str(numero + 1))
    elif args[0] == "dec":
        print(f"El valor reducido es ahora: {numero - 1}")
        fichero.writelines(str(numero - 1))
    else:
        print(f"Argumento {args[0]} desconocido.")
elif num_args == 2:
    # Si solo se da 2 argumentos
    try:
        # Convertir args[1] a entero
        arg1_numero = int(args[1])
        if args[0] == "inc":
            print(f"El valor aumentado es ahora: {numero + arg1_numero}")
            fichero.writelines(str(numero + arg1_numero))
        elif args[0] == "dec":
            print(f"El valor reducido es ahora: {numero - arg1_numero}")
            fichero.writelines(str(numero - arg1_numero))
        else:
            print(f"Argumento {args[0]} desconocido.")
    except ValueError:
        # Si la conversión falló, entonces no es un número entero.
        print(f"El argumento {args[1]} no es un número entero.")
else:
    print("Demasiados argumentos.")

# Cerrar el fichero
fichero.close()

3. Fes un mètode per xifrar un fitxer de text. Rebrà com a paràmetre un fitxer de text i crearà un altre, afegint al nom de l'original "_cod" i amb la mateixa extensió. L'algoritme de xifrat consisteix en.

import os

print("Programa de cifrado de archivos.\n")

# Función para cifrar archivo
def encrypt(file):
    # Abrir el fichero para leer
    fichero = open(file, "r")
    # Leer contenido del fichero
    contenido = fichero.read()
    # Crear contenido encryptado
    contenido_encryptado = ''

    for i in contenido:
        if i.islower():
            # Cifrar caracteres de la "a" a la "z"
            encryptado_i = (ord(i) - 11)
        elif i.isupper():
            # Cifrar caracteres de la "A" a la "Z"
            encryptado_i = (ord(i) + 15)
        elif i.isdigit():
            # Cifrar caracteres del "0" al "9"
            encryptado_i = (ord(i) + 13)
        else:
            # Dejar otros caracteres sin cambios
            encryptado_i = ord(i)
        contenido_encryptado += chr(encryptado_i)

    # Crear un nuevo fichero
    # Esta línea es necesaria si hay varios puntos en el nombre del archivo.
    fichero_parts = file.rsplit('.', 1)
    cod_fichero = '_cod.'.join(fichero_parts)
    with open(cod_fichero, 'w') as cod:
        # Escribir contenido cifrado en un archivo nuevo
        cod.write(contenido_encryptado)

    # Cerrar fichero
    fichero.close()

#file = "UF3-A2.1-03.txt"
file=input("Especifique el archivo que desea cifrar: ")

if os.path.exists(file):
   encrypt(file)
   print("La tarea se ha completado.")
else:
   print(f"El fichero {file} no existe.")

4. El fitxer comarques.txt conté un llistat de les comarques de Catalunya. És un fitxer de text i cada comarca ocupa una línia. Feu un programa amb un menú que ens permeti executar els mètodes per.

# Ruta al archivo de la lista
file = "comarques.txt"
# Nuevo nombre de archivo para las funciones (tareas) 3 y 4
new_file = ""

# Diccionario para las funciones (tareas) 2 y 3
diccionario = {}


# Función para comprobar que se ha introducido un número entero para menu()
def get_choice():
    try:
        choice = int(input("Seleccione la opción de menú: "))
        return choice
    except ValueError:
        print("Entrada inválida. Por favor ingrese un número entero válido.")
        return get_choice()


# Tarea 1.
def tarea_1():
    # contador
    counter = 0

    # Pedir que se introduzca una letra
    letra = input("Introduzca una letra: ")

    # Comprobar que sólo se introduce una letra y que se trata de una letra latina
    if len(letra) != 1 or not letra.isalpha():
        print("Sólo tiene que introducir una letra latina.")
    else:
        # Si todo va bien, convertir la letra en mayúscula, ya que todos los nombres del archivo empiezan por mayúscula
        if letra.islower():
            letra = letra.upper()

        # Imprimir la lista
        print("Lista de comarcas:\n")
        # Abrir el fichero para leer (r)
        with open(file, 'r') as f:
            # leer cada línea
            for line in f:
                # si la línea empieza por la "letra", la imprimir y actualizar el contador
                if line.startswith(letra):
                    print(line.strip())
                    counter += 1
        # Imprimir contador
        print(f'Total comarcas que empiezan por la letra {letra}: {counter}\n')
        # Volver a menu
        menu()
# Tarea 2.
def tarea_2():
    # Importar el diccionario global
    global diccionario

    # Leer el fichero
    with open(file, 'r') as f:
        # leer cada línea del archivo
        for line in f:
            # eliminar los caracteres de salto de línea y los espacios al final y al principio de una línea
            line = line.strip()
            # comprobar que la línea no está vacía
            if line:
                # primer carácter de la línea
                prim_char = line[0]
                # si aún no se ha encontrado el carácter, añádir lo al diccionario
                if prim_char not in diccionario:
                    diccionario[prim_char] = 1
                # si el carácter ya está en el diccionario, aumentar contador de letras
                else:
                    diccionario[prim_char] += 1

    # Imprimir el diccionario
    print(f"La operación ha generado un diccionario: {dict}\n")

    # Volver a menu
    menu()

# Tarea 3.
def tarea_3():
    # Importar el diccionario global
    global diccionario
    # Importar el nombre para fichero nuevo
    global new_file

    # revisión de diccionario
    if not diccionario:
        print("El diccionario está vacío. Genere un diccionario utilizando la opción 2 del menú.")
        menu()

    # Generar nombre para nuevo fichero
    fichero_parts = file.rsplit('.', 1)
    new_file = '_new.'.join(fichero_parts)

    # Crear un nuevo archivo y guardar en él los datos del diccionario
    with open(new_file, 'w') as f:
        for letra, num in diccionario.items():
            f.write('{}\t{}\n'.format(letra, num))

    # Imprimir que los datos se han guardado.
    print(f"Se ha generado el archivo {new_file}.\n")

    # Volver a menu
    menu()

# Tarea 4.
def tarea_4():
    try:
        with open(new_file, "r") as f:
            # si el fichero existe
            counter = 0
            for line in f:
                # dividir la línea en una letra y un número
                letra, num = line.split('\t')
                # actualizar contador
                counter += int(num.rstrip('\n'))

        # Imprimir resultado
        print(f"Total comarcas: {counter}.\n")

        # Volver a menu
        menu()

    except FileNotFoundError:
        # si el fichero no existe
        print("El fichero no existe. Debe generarse utilizando la opción 3 del menú.\n")
        menu()

def menu():
    print("las comarcas de Cataluña.\n"
          "1. Mostrar todas las comarcas que empiecen por una letra\n"
          "2. Crear un diccionario de las comarcas\n"
          "3. Crear un nuevo archivo con los datos del diccionario del apartado 2\n"
          "4. A partir del archivo del ap. 3 sumar y mostrar cuantas comarcas existen\n"
          "5. Salir")

    mode = get_choice()

    if mode == 1:
        tarea_1()
    elif mode == 2:
        tarea_2()
    elif mode == 3:
        tarea_3()
    elif mode == 4:
        tarea_4()
    elif mode == 5:
        print("Adiós.")
        quit()
    else:
        print("Ha seleccionado un valor no válido.")
        menu()
menu()