Keywords: easytut

Siguiente: Manejo de la imperfección Arriba: Tutor de Python para No-programadores Anterior: La venganza de las hileras Contenido
Subsecciones

- Ejercicios

# Lectura y escritura de archivos

Aquí tiene un ejemplo sencillo de lectura y escritura de archivos:

    #Escribe un archivo
    archivo_salida = open("prueba.txt","w")
    archivo_salida.write("Este texto va para el archivo de salida\nVea el archivo y compruebelo\n")
    archivo_salida.close()

    #Lee un archivo
    archivo_entrada = open("prueba.txt","r")
    texto = archivo_entrada.read()
    archivo_entrada.close()

    print texto,

La salida y el contenido del archivo prueba.txt son:

    Este texto va para el archivo de salida
    Vea el archivo y compruebel

Observe que escribió un archivo llamado prueba.txt en el directorio desde el cual ejecutó el programa. El `\n` en la hilera le dice a Python que introduzca un retorno de carro en su lugar (nuevo renglón).

Una vista rápida de lectura y escritura de archivos es:

1. Cree un objeto de archivo con la función `open`.
2. Lea o escriba al objeto de archivo (dependiendo de cómo lo abrió)
3. Ciérrelo

El primer paso es obtener un objeto de archivo. Para hacer esto usamos la función `open`. El formato es `objeto_archivo = open(nombrearchivo,modo)` donde `objeto_archivo` es la variable para poner el objeto archivo, `nombrearchivo` es una hilera con el nombre del archivo, y `modo` es ya sea `"r"` para leer un archivo o `"w"` para escribir en un archivo. Luego podemos llamar las funciones de los objetos de archivo. Las dos más comunes son `read` y `write`. La función `write` añade una hilera al final del archivo. La función `read` lee la siguiente cosa en el archivo y la devuelve como una hilera. Si no proporcionamos argumentos, devolverá todo el contenido del archivo (tal como en el ejemplo).

Ahora veamos una nueva versión del programa de números telefónicos que hicimos anteriormente:

    import string

    verdadero = 1
    falso = 0

    def imprimir_numeros(numeros):
        print "Numeros telefonicos:"
        for x in numeros.keys():
            print "Nombre: ",x," \tNumero: ",numeros[x]
        print

    def agregar_numero(numeros,nombre,numero):
        numeros[nombre] = numero

    def buscar_numero(numeros,nombre):
        if numeros.has_key(nombre):
            return "El numero es "+numeros[nombre]
        else:
            return "No pude hallar a "+nombre

    def eliminar_numero(numeros,nombre):
        if numeros.has_key(nombre):
            del numeros[nombre]
        else:
            print "No pude hallar a ", nombre

    def cargar_numeros(numeros,nombrearchivo):
        archivo_entrada = open(nombrearchivo,"r")
        while verdadero:
            renglon_entrada = archivo_entrada.readline()
            if renglon_entrada == "":
                break
            renglon_entrada = renglon_entrada[:-1]
            [nombre,numero] = string.split(renglon_entrada,",")
            numeros[nombre] = numero
        archivo_entrada.close()

    def guardar_numeros(numeros,nombrearchivo):
        archivo_salida = open(nombrearchivo,"w")
        for x in numeros.keys():
            archivo_salida.write(x+","+numeros[x]+"\n")
        archivo_salida.close()

    def imprimir_menu():
        print '1. Imprimir numeros telefonicos'
        print '2. Agregar numero telefonico'
        print '3. Borrar numero telefonico'
        print '4. Buscar numero telefonico'
        print '5. Cargar numeros'
        print '6. Guardar numeros'
        print '7. Cerrar el programa'
        print

    lista_telefonos = {}
    seleccion_menu = 0
    imprimir_menu()
    while seleccion_menu != 7:
        seleccion_menu = input("Escriba su seleccion (1-7):")
        if seleccion_menu == 1:
            imprimir_numeros(lista_telefonos)
        elif seleccion_menu == 2:
            print "Agregue nombre y numero"
            nombre = raw_input("Nombre:")
            telefono = raw_input("Numero:")
            agregar_numero(lista_telefonos,nombre,telefono)
        elif seleccion_menu == 3:
            print "Borrar nombre y numero"
            nombre = raw_input("Nombre:")
            borrar_numero(lista_telefonos,nombre)
        elif seleccion_menu == 4:
            print "Buscar numero"
    	nombre = raw_input("Nombre:")
            print buscar_numero(lista_telefonos,nombre)
        elif seleccion_menu == 5:
            nombrearchivo = raw_input("Archivo para cargar:")
            cargar_numeros(lista_telefonos,nombrearchivo)
        elif seleccion_menu == 6:
            nombrearchivo = raw_input("Archivo en el cual guardar:")
            guardar_numeros(lista_telefonos,nombrearchivo)
        elif seleccion_menu == 7:
            pass
        else:
            imprimir_menu()
    print "Adios"

Observe que ahora incluye guardar y cargar archivos. Aquí tiene la salida de las dos veces que lo ejecuté:

    > python telefonos2.py
    1. Imprimir numeros telefonicos
    2. Agregar numero telefonico
    3. Borrar numero telefonico
    4. Buscar numero telefonico
    5. Cargar numeros
    6. Guardar numeros
    7. Cerrar el programa

    Escriba su seleccion (1-7):2
    Agregue nombre y numero
    Nombre:Juana
    Numero:1234
    Escriba su seleccion (1-7):2
    Agregue nombre y numero
    Nombre:Pedro
    Numero:4321
    Escriba su seleccion (1-7):1
    Numeros telefonicos:
    Nombre:  Pedro  	Numero:  4321
    Nombre:  Juana  	Numero:  1234

    Escriba su seleccion (1-7):6
    Archivo en el cual guardar:numeros.txt
    Escriba su seleccion (1-7):7
    Adios

    > python telefonos2.py
    1. Imprimir numeros telefonicos
    2. Agregar numero telefonico
    3. Borrar numero telefonico
    4. Buscar numero telefonico
    5. Cargar numeros
    6. Guardar numeros
    7. Cerrar el programa

    Escriba su seleccion (1-7):5
    Archivo para cargar:numeros.txt
    Escriba su seleccion (1-7):1
    Numeros telefonicos:
    Nombre:  Pedro  	Numero:  4321
    Nombre:  Juana  	Numero:  1234

    Escriba su seleccion (1-7):7
    Adios

Las nuevas porciones de este programa son:

    def cargar_numeros(numeros,nombrearchivo):
        archivo_entrada = open(nombrearchivo,"r")
        while verdadero:
            renglon_entrada = archivo_entrada.readline()
            if renglon_entrada == "":
                break
            renglon_entrada = renglon_entrada[:-1]
            [nombre,numero] = string.split(renglon_entrada,",")
            numeros[nombre] = numero
        archivo_entrada.close()

    def guardar_numeros(numeros,nombrearchivo):
        archivo_salida = open(nombrearchivo,"w")
        for x in numeros.keys():
            archivo_salida.write(x+","+numeros[x]+"\n")
        archivo_salida.close()

Veamos la porción para guardar números. Primero crea un objeto archivo con la función `open(nombrearchivo,"w")`. Luego lo recorre y crea un renglón para cada número telefónico con la función `archivo_salida.write(x+","+numeros[x]+"\n")`. Esto escribe un renglón que contiene el nombre, una coma, el número y empieza un renglón nuevo.

La porción de carga es un poco más complicada. Empieza obteniendo el objeto archivo. Entonces usa un rizo `while 1:` para mantenerse dentro del rizo hasta que encuentre un enunciado `break`. Luego lee un renglón al ejecutar `renglon_entrada = archivo_entrada.readline()`. La función `getline` devolverá un una hilera vacía (len(string) == 0) cuando llegue al final del archivo. El enunciado `if` revisa si esto ha ocurrido y usa el `break` para salir del rizo cuando ha llegado al final del archivo. Por supuesto que si la función `readline` no devolviera el retorno de carro al final del renglón, no habría modo de saber si una hilera vacía era un renglón vacío o el final del archivo así que el retorno de carro es conservado en lo que devuelve `getline`. Por lo tanto, tenemos que deshacernos del retorno de carro. El renglón en `renglon_entrada = renglon_entrada[:-1]` hace esto eliminando la última letra. A continuación, el renglón`[nombre,numero] = string.split(renglon_entrada,",")`divide el renglón usando la coma como separador en un nombre y un número. Este par es luego añadido al diccionario `numeros`.

# Ejercicios

Ahora modifique el programa de calificaciones de la sección 11 para que escriba y lea archivos que contengan los registros de los estudiantes.

Siguiente: Manejo de la imperfección Arriba: Tutor de Python para No-programadores Anterior: La venganza de las hileras Contenido
Traducido por Victor M. Rosas-Garcia quimico69@yahoo.com