Fundamentos del Acceso a Archivos

PythonPythonBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

La mayoría de los programas necesitan leer la entrada de algún lugar. Esta sección aborda el acceso a archivos.

Entrada y salida de archivos

Abrir un archivo.

f = open('foo.txt', 'rt')     ## Abrir para lectura (texto)
g = open('bar.txt', 'wt')     ## Abrir para escritura (texto)

Leer todos los datos.

data = f.read()

## Leer solo hasta 'maxbytes' bytes
data = f.read([maxbytes])

Escribir algunos textos.

g.write('algun texto')

Cerrar cuando hayas terminado.

f.close()
g.close()

Los archivos deben cerrarse correctamente y es fácil olvidarse de este paso. Por lo tanto, el enfoque preferido es usar la declaración with de la siguiente manera.

with open(nombre_archivo, 'rt') as archivo:
    ## Usar el archivo `archivo`
  ...
    ## No es necesario cerrar explícitamente
...instrucciones

Esto cierra automáticamente el archivo cuando el control sale del bloque de código con sangría.

Expresiones habituales para leer datos de archivos

Leer todo un archivo de una vez como una cadena.

with open('foo.txt', 'rt') as archivo:
    datos = archivo.read()
    ## `datos` es una cadena con todo el texto de `foo.txt`

Leer un archivo línea por línea mediante iteración.

with open(nombre_archivo, 'rt') as archivo:
    for linea in archivo:
        ## Procesar la línea

Expresiones habituales para escribir en un archivo

Escribir datos de cadena.

with open('outfile', 'wt') as out:
    out.write('Hello World\n')
 ...

Redirigir la función print.

with open('outfile', 'wt') as out:
    print('Hello World', file=out)
 ...

Estos ejercicios dependen de un archivo portfolio.csv. El archivo contiene una lista de líneas con información sobre un portafolio de acciones. Se asume que estás trabajando en el directorio ~/project/. Si no estás seguro, puedes averiguar dónde Python cree que está ejecutándose haciendo lo siguiente:

>>> import os
>>> os.getcwd()
'/home/labex/project' ## Output vary
>>>

Ejercicio 1.26: Preliminares de archivos

Primero, intenta leer todo el archivo de una vez como una gran cadena:

>>> with open('portfolio.csv', 'rt') as f:
        data = f.read()

>>> data
'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n'
>>> print(data)
name,shares,price
"AA",100,32.20
"IBM",50,91.10
"CAT",150,83.44
"MSFT",200,51.23
"GE",95,40.37
"MSFT",50,65.10
"IBM",100,70.44
>>>

En el ejemplo anterior, hay que notar que Python tiene dos modos de salida. En el primer modo donde escribes data en el prompt, Python te muestra la representación de cadena sin procesar incluyendo comillas y códigos de escape. Cuando escribes print(data), obtienes la salida formateada real de la cadena.

Aunque leer un archivo de una vez es simple, a menudo no es la forma más adecuada de hacerlo, especialmente si el archivo resulta ser enorme o si contiene líneas de texto que quieres manejar una a la vez.

Para leer un archivo línea por línea, utiliza un bucle for de la siguiente manera:

>>> with open('portfolio.csv', 'rt') as f:
        for line in f:
            print(line, end='')

name,shares,price
"AA",100,32.20
"IBM",50,91.10
...
>>>

Cuando utilizas este código como se muestra, se leen las líneas hasta que se alcanza el final del archivo, momento en el que el bucle se detiene.

En ciertas ocasiones, es posible que desees leer manualmente o omitir una única línea de texto (por ejemplo, quizás desees omitir la primera línea de encabezados de columna).

>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f)
>>> headers
'name,shares,price\n'
>>> for line in f:
    print(line, end='')

"AA",100,32.20
"IBM",50,91.10
...
>>> f.close()
>>>

next() devuelve la siguiente línea de texto del archivo. Si lo llamaras repetidamente, obtendrías líneas sucesivas. Sin embargo, para que lo sepas, el bucle for ya utiliza next() para obtener sus datos. Por lo tanto, normalmente no lo llamarías directamente a menos que estés intentando omitir o leer explícitamente una sola línea como se muestra.

Una vez que estás leyendo las líneas de un archivo, puedes comenzar a realizar más procesamiento, como dividir. Por ejemplo, prueba esto:

>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f).split(',')
>>> headers
['name','shares', 'price\n']
>>> for line in f:
    row = line.split(',')
    print(row)

['"AA"', '100', '32.20\n']
['"IBM"', '50', '91.10\n']
...
>>> f.close()

Nota: En estos ejemplos, se está llamando explícitamente a f.close() porque no se está utilizando la declaración with.

Ejercicio 1.27: Leyendo un archivo de datos

Ahora que sabes cómo leer un archivo, escribamos un programa para realizar un cálculo simple.

Las columnas en portfolio.csv corresponden al nombre de la acción, el número de acciones y el precio de compra de una sola posición de acciones. Escribe un programa llamado pcost.py en el directorio /home/labex/project que abra este archivo, lea todas las líneas y calcule cuánto costó comprar todas las acciones del portafolio.

Consejo: para convertir una cadena a un entero, utiliza int(s). Para convertir una cadena a un número de punto flotante, utiliza float(s).

Tu programa debe imprimir una salida como la siguiente:

Total cost 44671.15
✨ Revisar Solución y Practicar

Ejercicio 1.28: Otros tipos de "archivos"

¿Qué pasa si quieres leer un archivo no de texto, como un archivo de datos comprimido con gzip? La función open() incorporada no te ayudará aquí, pero Python tiene un módulo de biblioteca gzip que puede leer archivos comprimidos con gzip.

Prueba:

>>> import gzip
>>> with gzip.open('portfolio.csv.gz', 'rt') as f:
    for line in f:
        print(line, end='')

... mira la salida...
>>>

Nota: Incluir el modo de archivo de 'rt' es fundamental aquí. Si lo olvidas, obtendrás cadenas de bytes en lugar de cadenas de texto normales.

Comentario: ¿No deberíamos estar usando Pandas para esto?

Los científicos de datos rápidamente señalan que bibliotecas como Pandas ya tienen una función para leer archivos CSV. Esto es cierto, y funciona bastante bien. Sin embargo, este no es un curso sobre el aprendizaje de Pandas. La lectura de archivos es un problema más general que los detalles específicos de los archivos CSV. La principal razón por la que estamos trabajando con un archivo CSV es que es un formato familiar para la mayoría de los programadores y es relativamente fácil de trabajar directamente, lo que ilustra muchas características de Python en el proceso. Entonces, sin duda, utiliza Pandas cuando vuelvas a trabajar. Sin embargo, durante el resto de este curso, vamos a seguir con la funcionalidad estándar de Python.

Resumen

¡Felicitaciones! Has completado el laboratorio de Gestión de Archivos. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.