Leer archivos con Python

    Para trabajar con datos almacenados, el manejo de archivos pertenece al conocimiento básico de todo programador profesional de Python. Desde su primera versión, tanto la lectura como la escritura de datos en archivos son funciones integradas de Python. En comparación con otros lenguajes de programación como C o Java, es bastante simple y solo requiere unas pocas líneas de código. Además, no es necesario cargar ningún módulo adicional para hacerlo correctamente.

    Conceptos básicos de archivos en Python

    Los métodos habituales para operar con archivos son open() para abrir un archivo, seek() para establecer la posición actual del archivo en el desplazamiento dado, y close() para cerrar el objeto de archivo cuando haya terminado de usarlo. los open() El método devuelve un identificador de archivo que representa un objeto de archivo que se utilizará para acceder al archivo para leer, escribir o agregar.

    Al abrir un archivo para leerlo, Python necesita saber exactamente cómo se debe abrir el archivo con el sistema. Hay dos modos de acceso disponibles: lectura y lectura en modo binario. Las respectivas banderas utilizadas son ry rb, y deben especificarse al abrir un archivo con el open() método. El primer modo incluye la interpretación de caracteres especiales como «CR» (retorno de carro) y «LF» (salto de línea) para representar saltos de línea, mientras que el modo binario le permite leer los datos en modo crudo, donde los datos se almacenan como no tiene más interpretación.

    Una vez que haya abierto un archivo, open() le devolverá un objeto de archivo. Estos objetos de archivo tienen métodos como read(), readline(), write(), tell()y seek(). Si bien algunos objetos de archivo (u objetos similares a archivos) tienen más métodos que los enumerados aquí, estos son los más comunes. No todos los objetos de archivo necesitan implementar todos los métodos de archivo.

    Ejemplos

    En este artículo explicaremos cómo leer archivos con Python a través de ejemplos. Algunos ejemplos incluyen leer un archivo línea por línea, como un fragmento (un número definido de línea a la vez) y leer un archivo de una vez. Además, le mostraremos una forma de leer una línea específica del archivo, solo, sin buscar en todo el archivo.

    Leer un archivo línea por línea

    El primer ejemplo está inspirado en los dos lenguajes de programación C y C ++. Es bastante simple, abra el archivo usando el open() método, lea el archivo línea por línea usando el readline() método, y emitiendo la línea inmediatamente después de leer. En uso aquí hay un while bucle que lee continuamente desde el archivo siempre que el readline() El método sigue devolviendo datos. En caso de fin del documento (EOF) se alcanza el while El bucle se detiene y el objeto de archivo se cierra, liberando los recursos para que los usen otros programas.

    # define the name of the file to read from
    filename = "test.txt"
    
    # open the file for reading
    filehandle = open(filename, 'r')
    while True:
        # read a single line
        line = filehandle.readline()
        if not line:
            break
        print(line)
    
    # close the pointer to that file
    filehandle.close()
    

    Listado 1

    Como puede haber notado en el Listado 1, hemos abierto y cerrado explícitamente el archivo (líneas 5 y 14, respectivamente). Aunque el intérprete de Python cierra los archivos abiertos automáticamente al final de la ejecución del programa Python, cerrando explícitamente el archivo mediante close() es un buen estilo de programación y no debe olvidarse.

    Como mejora, en Python 2.3 se introdujo el conveniente protocolo de iterador. Esto le permite simplificar la readline bucle de la siguiente manera:

    # define the name of the file to read from
    filename = "test.txt"
    
    for line in open(filename, 'r'):
        print(line)
    

    Listado 2

    En uso aquí hay un for bucle en combinación con el in iterador. El archivo se abre en la línea 4 del Listado 2. La línea actual se identifica con la ayuda del in iterador, se lee desde el archivo y su contenido se envía a stdout en la línea 5. Python cubre la apertura y el cierre del archivo cuando cae fuera de su alcance. Si bien es ineficaz, esto le permite no tener que lidiar más con los manejadores de archivos.

    Desafortunadamente, el código anterior es menos explícito y se basa en la recolección de basura interna de Python para manejar el cierre del archivo. Introducido en Python 2.5, el with El comando encapsula aún más todo el proceso y también maneja la apertura y el cierre de archivos solo una vez en todo el bloque de código con ámbito. El Listado 3 muestra cómo utilizar with mando.

    # define the name of the file to read from
    filename = "test.txt"
    
    with open(filename, 'r') as filehandle:
        for line in filehandle:
            print(line)
    

    Listado 3

    La combinación del with declaración y el open() El comando abre el archivo solo una vez (línea 4). Si tiene éxito el for se ejecuta el bucle y el contenido de la línea se imprime en stdout (líneas 5 y 6).

    Además, el uso del with declaración tiene un efecto secundario. Internamente, el intérprete de Python crea un tryfinally-bloque para encapsular la lectura del archivo. El Listado 4 muestra lo que esencialmente está sucediendo internamente en Python con el with bloques de código:

    try:
        filehandle = open(filename, 'r')
        # do something
    finally:
        filehandle.close()
    

    Listado 4

    Leer un archivo como fragmentos de líneas

    Hasta ahora hemos procesado un archivo línea por línea. Esto es bastante lento para archivos grandes y se puede mejorar leyendo varias líneas al mismo tiempo. Para lograr eso, el islice() método del itertools entra en juego el módulo. Además, funciona como un iterador y devuelve una gran cantidad de datos que consta de n líneas. Al final del archivo, el resultado puede ser más corto y, finalmente, la llamada devolverá una lista vacía.

    from itertools import islice
    
    # define the name of the file to read from
    filename = "test.txt"
    
    # define the number of lines to read
    number_of_lines = 5
    
    with open(filename, 'r') as input_file:
        lines_cache = islice(input_file, number_of_lines)
       
        for current_line in lines_cache:
            print (current_line)
    

    Listado 5

    Leer una línea específica de un archivo

    Usando los métodos mostrados arriba también podemos realizar otras acciones útiles, como leer una línea específica de un archivo. Para hacer esto, usamos un contador e imprimimos la línea apropiada cuando llegamos a él mientras iteramos a través del archivo.

    # define the name of the file to read from
    filename = "test.txt"
    
    # define the line number
    line_number = 3
    
    print ("line %i of %s is: " % (line_number, filename))
    
    with open(filename, 'r') as filehandle:
    current_line = 1
        for line in filehandle:
            if current_line == line_number:
                print(line)
                break
            current_line += 1
    

    Listado 6

    El Listado 6 debería ser fácil de entender, pero es un poco más largo que los ejemplos anteriores. Puede acortarse utilizando el linecache módulo. El Listado 7 muestra cómo simplificar el código usando el getline() método. Si el número de línea solicitado cae fuera del rango de líneas válidas en el archivo, entonces el getline() En su lugar, el método devuelve una cadena vacía.

    # import linecache module
    import linecache
    
    # define the name of the file to read from
    filename = "test.txt"
    
    # define line_number
    line_number = 3
    
    # retrieve specific line
    line = linecache.getline(filename, line_number)
    print ("line %i of %s:" % (line_number, filename))
    print (line)
    

    Listado 7

    Leer el archivo completo a la vez

    Por último, pero no menos importante, veremos un caso muy diferente al del ejemplo anterior: leer un archivo completo de una vez. Tenga en cuenta que, en la mayoría de los casos, debe tener suficiente espacio en su computadora para leer todo el archivo en la memoria. El Listado 8 usa una combinación del with declaración, y el read() método. En este caso usaremos read() para cargar el contenido del archivo como un flujo de datos.

    # define the name of the file to read from
    filename = "test.txt"
    
    with open(filename, 'r') as filehandle:
        filecontent = filehandle.read()
        print (filecontent)
    

    Listado 8

    Python también ofrece la readlines() método, que es similar al readline() método del primer ejemplo. En contraste con read(), el contenido del archivo se almacena en una lista, donde cada línea del contenido es un elemento. El Listado 9 muestra cómo acceder a esos datos:

    # define the name of the file to read from
    filename = "test.txt"
    
    with open(filename, 'r') as filehandle:
        filecontent = filehandle.readlines()
        for line in filecontent:
            print (line)
    

    Listado 9

    Mientras readlines() leerá el contenido del archivo hasta que llegue a EOF, tenga en cuenta que también puede limitar la cantidad de contenido leído proporcionando el sizehint parámetro, que es el número de bytes a leer.

    Conclusión

    Como es habitual, hay más de una forma de leer el contenido de un archivo. En cuanto a velocidad, todos ellos están más o menos en la misma categoría. En cuanto a qué solución funciona mejor para usted, depende de su caso de uso específico. Creemos que es muy útil ver qué es posible y luego elegir la solución que mejor se adapte.

    Si bien Python simplifica enormemente el proceso de lectura de archivos, a veces puede resultar complicado, en cuyo caso te recomiendo que eches un vistazo a la documentación oficial de Python para más información.

    Recursos

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *