Lectura de archivos con Python

Introducción

Para trabajar con datos almacenados, el manejo de archivos se convierte en el conocimiento central 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.

En este artículo estaremos explicando 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íneas a la vez) y leer un archivo de una sola vez. Además, le mostraremos una forma de leer una línea específica del archivo, solo, sin buscar en todo el archivo.

Conceptos básicos de archivos en Python

Los métodos comunes 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. el incorporado open() La función 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 debe abrirse el archivo con el sistema. Hay dos modos de acceso disponibles: lectura y lectura en modo binario. Las respectivas banderas utilizadas son 'r'y 'rb', y deben especificarse al abrir un archivo con el incorporado open() función. 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 sin procesar, donde los datos se almacenan tal cual. sin más interpretación.

Una vez que haya abierto un archivo, el open() La función 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 que se enumeran aquí, estos son los más comunes. No todos los objetos de archivo necesitan implementar todos los métodos de archivo.

Lectura de un archivo línea por línea

El primer ejemplo está inspirado en los dos lenguajes de programación: C y C++. Es probablemente el enfoque más intuitivo: abra el archivo con el open() función, leer el archivo línea por línea usando el readline() método, y la salida de la línea inmediatamente después de la lectura.

En uso aquí hay un while bucle que lee continuamente del archivo mientras el readline() El método sigue devolviendo datos. En caso de que se alcance el final del archivo (EOF), el while el bucle se detiene y el objeto de archivo se cierra, liberando los recursos para que los usen otros programas:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

Como habrá notado, hemos abierto y cerrado explícitamente el archivo en este ejemplo. Aunque el intérprete de Python cierra los archivos abiertos automáticamente al final de la ejecución del programa de Python, cerrando explícitamente el archivo a través de close() es un buen estilo de programación y no debe olvidarse.

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


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

En uso aquí hay un for bucle en combinación con el in iterador La línea actual se identifica con la ayuda del in iterador, se lee del archivo y su contenido se envía a stdout. Python cubre la apertura y el cierre del archivo por usted cuando queda fuera del alcance. Si bien es ineficiente, esto le permite no tener que lidiar más con los identificadores 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 todo el proceso aún más, y también maneja abrir y cerrar archivos solo una vez en todo el bloque de código de ámbito:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

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

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

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

Lectura de 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 herramientas iterativas El módulo entra en juego. Además, funciona como un iterador y devuelve un fragmento 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

filename = "test.txt"

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)

Lectura de una línea específica de un archivo

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


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

Esto debería ser fácil de entender, pero es un poco más largo que los ejemplos anteriores. Se puede acortar usando el caché de línea módulo.

El siguiente ejemplo 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() método devuelve una cadena vacía en su lugar:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

Leer todo el archivo a la vez

Por último, pero no menos importante, veremos un caso muy diferente al ejemplo anterior: leer un archivo completo de una sola vez.

Tenga en cuenta que, en la mayoría de los casos, debe tener suficiente memoria para leer el archivo completo, ya que los caracteres no ocupan demasiado espacio, pero esté cansado de los archivos grandes. El siguiente ejemplo utiliza una combinación de los with declaración, y el read() método. En este caso, usaremos read() para cargar el contenido del archivo como un flujo de datos:

Consulte nuestra guía práctica y práctica para aprender Git, con las mejores prácticas, los estándares aceptados por la industria y la hoja de trucos incluida. Deja de buscar en Google los comandos de Git y, de hecho, aprenden ella!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

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:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

Aunque la 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 de costumbre, hay más de una forma de leer el contenido de un archivo. En términos de velocidad, todos ellos están más o menos en la misma categoría. La solución que funcione mejor para usted depende de su caso de uso específico. Creemos que es bastante ú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 volverse complicado, en cuyo caso le recomiendo que eche un vistazo a la documentación oficial de Python para más información.

Sello de tiempo:

Mas de Abuso de pila