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 *