HDP115

Manejo de Archivos

Aprende a leer, escribir y manipular archivos en Python, incluyendo archivos de texto, binarios, CSV, JSON y más.

CE

Cristian Escalante

Última actualización: 21 de mayo de 2025

python
programación
archivos

Manejo de Archivos en Python

La capacidad de trabajar con archivos es fundamental en programación. Python ofrece funciones integradas para leer, escribir y manipular archivos de manera sencilla y eficiente. En esta lección, aprenderemos a trabajar con diferentes tipos de archivos, desde simples archivos de texto hasta formatos estructurados como CSV y JSON.

Operaciones básicas con archivos

Abrir y cerrar archivos

En Python, utilizamos la función open() para abrir un archivo. Esta función devuelve un objeto de archivo que podemos utilizar para leer o escribir datos.

# Sintaxis básica: open(ruta_archivo, modo)
archivo = open("ejemplo.txt", "r")  # Abrir en modo lectura
# Operaciones con el archivo...
archivo.close()  # Importante: cerrar el archivo cuando terminemos

Modos de apertura de archivos

Python ofrece varios modos para abrir archivos:

ModoDescripción
"r"Lectura (predeterminado). El archivo debe existir.
"w"Escritura. Crea el archivo si no existe, o lo trunca si existe.
"a"Añadir. Crea el archivo si no existe, o añade al final si existe.
"x"Creación exclusiva. Falla si el archivo ya existe.
"b"Modo binario (se añade a otros modos: "rb", "wb", etc.)
"t"Modo texto (predeterminado, se añade a otros modos: "rt", "wt", etc.)
"+"Actualización (lectura y escritura, se añade a otros modos: "r+", "w+", etc.)

Uso del contexto with (recomendado)

La mejor práctica para trabajar con archivos es usar el administrador de contexto with, que se encarga automáticamente de cerrar el archivo:

# Forma recomendada de abrir archivos
with open("ejemplo.txt", "r") as archivo:
    # Operaciones con el archivo...
    contenido = archivo.read()
    print(contenido)
# El archivo se cierra automáticamente al salir del bloque with

Lectura de archivos

Python ofrece varios métodos para leer el contenido de un archivo:

Leer todo el contenido

with open("ejemplo.txt", "r") as archivo:
    contenido = archivo.read()  # Lee todo el archivo como una cadena
    print(contenido)

Leer línea por línea

with open("ejemplo.txt", "r") as archivo:
    # Leer la primera línea
    primera_linea = archivo.readline()
    print(primera_linea)
    
    # Leer la siguiente línea
    segunda_linea = archivo.readline()
    print(segunda_linea)

Leer todas las líneas

with open("ejemplo.txt", "r") as archivo:
    # Leer todas las líneas en una lista
    lineas = archivo.readlines()
    for linea in lineas:
        print(linea, end="")  # end="" evita doble salto de línea

Iterar sobre el archivo

La forma más eficiente de leer un archivo línea por línea, especialmente para archivos grandes:

with open("ejemplo.txt", "r") as archivo:
    for linea in archivo:
        print(linea, end="")

Escritura de archivos

Escribir texto

with open("nuevo.txt", "w") as archivo:
    archivo.write("Hola, mundo!\n")
    archivo.write("Esta es la segunda línea.\n")

Escribir múltiples líneas

lineas = ["Primera línea\n", "Segunda línea\n", "Tercera línea\n"]

with open("lineas.txt", "w") as archivo:
    archivo.writelines(lineas)

Añadir a un archivo existente

with open("log.txt", "a") as archivo:
    archivo.write("Nuevo registro añadido\n")

Trabajar con rutas de archivos

El módulo os.path proporciona funciones para trabajar con rutas de archivos de manera compatible con diferentes sistemas operativos:

import os.path

# Comprobar si un archivo existe
existe = os.path.exists("archivo.txt")
print(f"¿El archivo existe? {existe}")

# Obtener la ruta absoluta
ruta_absoluta = os.path.abspath("archivo.txt")
print(f"Ruta absoluta: {ruta_absoluta}")

# Obtener el directorio y el nombre del archivo
directorio, nombre_archivo = os.path.split(ruta_absoluta)
print(f"Directorio: {directorio}")
print(f"Nombre del archivo: {nombre_archivo}")

# Obtener la extensión del archivo
nombre_base, extension = os.path.splitext(nombre_archivo)
print(f"Nombre base: {nombre_base}")
print(f"Extensión: {extension}")

El módulo pathlib (Python 3.4+)

Para una manipulación más orientada a objetos de las rutas, podemos usar el módulo pathlib:

from pathlib import Path

# Crear un objeto Path
ruta = Path("carpeta/subcarpeta/archivo.txt")

# Obtener información sobre la ruta
print(ruta.name)          # archivo.txt
print(ruta.stem)          # archivo
print(ruta.suffix)        # .txt
print(ruta.parent)        # carpeta/subcarpeta
print(ruta.exists())      # False (a menos que exista)

# Crear directorios
ruta.parent.mkdir(parents=True, exist_ok=True)

# Operaciones con rutas
nuevo_archivo = ruta.parent / "otro_archivo.txt"
print(nuevo_archivo)      # carpeta/subcarpeta/otro_archivo.txt

Manejo de archivos de texto con codificación

Para manejar correctamente archivos de texto con caracteres especiales (como acentos), es importante especificar la codificación:

# Escribir con codificación UTF-8
with open("acentos.txt", "w", encoding="utf-8") as archivo:
    archivo.write("¡Hola, cómo estás! Esto es español.\n")

# Leer con la misma codificación
with open("acentos.txt", "r", encoding="utf-8") as archivo:
    contenido = archivo.read()
    print(contenido)

Trabajar con archivos CSV

Los archivos CSV (Comma-Separated Values) son muy comunes para almacenar datos tabulares. Python proporciona el módulo csv para trabajar con ellos:

Leer un archivo CSV

import csv

with open("datos.csv", "r", newline="", encoding="utf-8") as archivo:
    lector_csv = csv.reader(archivo)
    
    # Leer la cabecera
    cabecera = next(lector_csv)
    print(f"Columnas: {cabecera}")
    
    # Leer los datos
    for fila in lector_csv:
        print(fila)

Leer un CSV como diccionario

import csv

with open("datos.csv", "r", newline="", encoding="utf-8") as archivo:
    lector_csv = csv.DictReader(archivo)
    
    for fila in lector_csv:
        print(f"Nombre: {fila['nombre']}, Edad: {fila['edad']}")

Escribir un archivo CSV

import csv

datos = [
    ["Nombre", "Edad", "Ciudad"],
    ["Ana", "28", "Madrid"],
    ["Carlos", "35", "Barcelona"],
    ["Elena", "42", "Valencia"]
]

with open("personas.csv", "w", newline="", encoding="utf-8") as archivo:
    escritor_csv = csv.writer(archivo)
    
    # Escribir varias filas a la vez
    escritor_csv.writerows(datos)

Escribir un CSV desde diccionarios

import csv

datos = [
    {"nombre": "Ana", "edad": 28, "ciudad": "Madrid"},
    {"nombre": "Carlos", "edad": 35, "ciudad": "Barcelona"},
    {"nombre": "Elena", "edad": 42, "ciudad": "Valencia"}
]

with open("personas_dict.csv", "w", newline="", encoding="utf-8") as archivo:
    campos = ["nombre", "edad", "ciudad"]
    escritor_csv = csv.DictWriter(archivo, fieldnames=campos)
    
    escritor_csv.writeheader()  # Escribir la cabecera
    escritor_csv.writerows(datos)  # Escribir los datos

Trabajar con archivos JSON

JSON (JavaScript Object Notation) es un formato muy popular para intercambiar datos. Python proporciona el módulo json para trabajar con este formato:

Leer un archivo JSON

import json

with open("datos.json", "r", encoding="utf-8") as archivo:
    datos = json.load(archivo)
    
    print(f"Nombre: {datos['nombre']}")
    print(f"Edad: {datos['edad']}")
    print(f"Ciudades visitadas: {', '.join(datos['ciudades_visitadas'])}")

Escribir un archivo JSON

import json

datos = {
    "nombre": "Ana García",
    "edad": 28,
    "casada": False,
    "hijos": None,
    "ciudades_visitadas": ["Madrid", "Barcelona", "París", "Londres"],
    "direccion": {
        "calle": "Calle Principal",
        "numero": 123,
        "ciudad": "Madrid",
        "codigo_postal": "28001"
    }
}

with open("persona.json", "w", encoding="utf-8") as archivo:
    # indent=2 para formatear el JSON con indentación
    json.dump(datos, archivo, indent=2, ensure_ascii=False)

Trabajar con archivos binarios

Para trabajar con archivos binarios (como imágenes, archivos de audio, etc.), usamos el modo binario ("b"):

Leer un archivo binario

with open("imagen.jpg", "rb") as archivo:
    contenido = archivo.read()
    print(f"Tamaño del archivo: {len(contenido)} bytes")
    print(f"Primeros 10 bytes: {contenido[:10]}")

Escribir un archivo binario

# Copiar un archivo binario
with open("imagen_original.jpg", "rb") as archivo_origen:
    contenido = archivo_origen.read()
    
    with open("imagen_copia.jpg", "wb") as archivo_destino:
        archivo_destino.write(contenido)

Manejo de excepciones con archivos

Es importante manejar posibles errores al trabajar con archivos:

try:
    with open("archivo_inexistente.txt", "r") as archivo:
        contenido = archivo.read()
except FileNotFoundError:
    print("El archivo no existe")
except PermissionError:
    print("No tienes permisos para acceder al archivo")
except Exception as e:
    print(f"Ocurrió un error: {e}")

Trabajar con directorios

Listar archivos y directorios

import os

# Listar todos los archivos y directorios en el directorio actual
for elemento in os.listdir("."):
    if os.path.isfile(elemento):
        print(f"Archivo: {elemento}")
    elif os.path.isdir(elemento):
        print(f"Directorio: {elemento}")

Crear y eliminar directorios

import os
import shutil

# Crear un directorio
os.mkdir("nueva_carpeta")

# Crear directorios anidados
os.makedirs("carpeta/subcarpeta/subsubcarpeta", exist_ok=True)

# Eliminar un directorio vacío
os.rmdir("nueva_carpeta")

# Eliminar un directorio y su contenido
shutil.rmtree("carpeta")

Ejemplos prácticos

Ejemplo 1: Contador de palabras

def contar_palabras(ruta_archivo):
    try:
        with open(ruta_archivo, "r", encoding="utf-8") as archivo:
            contenido = archivo.read()
            palabras = contenido.split()
            return len(palabras)
    except FileNotFoundError:
        print(f"El archivo {ruta_archivo} no existe.")
        return 0

# Uso
num_palabras = contar_palabras("ejemplo.txt")
print(f"El archivo contiene {num_palabras} palabras.")

Ejemplo 2: Registro de actividades (log)

import datetime

def registrar_actividad(mensaje):
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open("actividades.log", "a", encoding="utf-8") as archivo:
        archivo.write(f"[{timestamp}] {mensaje}\n")

# Uso
registrar_actividad("Inicio del programa")
# ... código del programa ...
registrar_actividad("Fin del programa")

Ejemplo 3: Procesamiento de un archivo CSV

import csv

def calcular_promedio_edades(ruta_archivo):
    total_edad = 0
    contador = 0
    
    with open(ruta_archivo, "r", newline="", encoding="utf-8") as archivo:
        lector_csv = csv.DictReader(archivo)
        
        for fila in lector_csv:
            try:
                edad = int(fila["edad"])
                total_edad += edad
                contador += 1
            except (ValueError, KeyError):
                continue
    
    if contador > 0:
        return total_edad / contador
    else:
        return 0

# Uso
promedio = calcular_promedio_edades("personas.csv")
print(f"La edad promedio es: {promedio:.2f} años")

Ejemplo 4: Convertir CSV a JSON

import csv
import json

def csv_a_json(archivo_csv, archivo_json):
    datos = []
    
    with open(archivo_csv, "r", newline="", encoding="utf-8") as archivo:
        lector_csv = csv.DictReader(archivo)
        for fila in lector_csv:
            datos.append(fila)
    
    with open(archivo_json, "w", encoding="utf-8") as archivo:
        json.dump(datos, archivo, indent=2, ensure_ascii=False)

# Uso
csv_a_json("datos.csv", "datos.json")

Ejemplo 5: Buscar texto en archivos

import os

def buscar_en_archivos(directorio, texto_buscar, extension=".txt"):
    resultados = []
    
    for raiz, _, archivos in os.walk(directorio):
        for archivo in archivos:
            if archivo.endswith(extension):
                ruta_completa = os.path.join(raiz, archivo)
                try:
                    with open(ruta_completa, "r", encoding="utf-8") as f:
                        contenido = f.read()
                        if texto_buscar in contenido:
                            resultados.append(ruta_completa)
                except Exception:
                    # Ignorar archivos que no se pueden leer
                    pass
    
    return resultados

# Uso
archivos_encontrados = buscar_en_archivos(".", "Python")
for archivo in archivos_encontrados:
    print(f"Encontrado en: {archivo}")

Mejores prácticas

  1. Siempre usa el administrador de contexto with para asegurarte de que los archivos se cierren correctamente, incluso si ocurren errores.
  2. Especifica la codificación al trabajar con archivos de texto, preferiblemente UTF-8.
  3. Maneja las excepciones que pueden ocurrir al trabajar con archivos.
  4. Usa newline="" al trabajar con archivos CSV para manejar correctamente los saltos de línea en diferentes sistemas operativos.
  5. Considera usar pathlib en lugar de os.path para un manejo más moderno y orientado a objetos de las rutas de archivos.
  6. Evita leer archivos grandes completos en memoria. En su lugar, procésalos línea por línea.
  7. Usa módulos especializados para formatos específicos (como csv, json, pickle, etc.) en lugar de intentar parsear manualmente.

Ejercicios prácticos

  1. Crea un programa que lea un archivo de texto y genere un informe con el número de líneas, palabras y caracteres.
  2. Implementa un sistema simple de base de datos usando archivos CSV, con funciones para añadir, buscar, actualizar y eliminar registros.
  3. Desarrolla un script que combine varios archivos CSV en uno solo, asegurándose de que las columnas coincidan.
  4. Crea un programa que lea un archivo JSON con información de productos y genere un informe de inventario en formato CSV.
  5. Implementa un sistema de respaldo que copie archivos modificados en las últimas 24 horas a un directorio de respaldo.

En la próxima lección, exploraremos las expresiones regulares en Python, una herramienta poderosa para trabajar con patrones de texto.

Programación Orientada a Objetos
Aprende los fundamentos de la programación orientada a objet...
Análisis de Datos en Python
Aprende a utilizar bibliotecas como NumPy, Pandas y Matplotl...
Referencias
Real Python. Reading and Writing Files in Python. https://realpython.com/read-write-files-python/
Real Python. Working With JSON Data in Python. https://realpython.com/python-json/
Real Python. Reading and Writing CSV Files in Python. https://realpython.com/python-csv/

Conceptos Básicos de HTML

Aprende los conceptos básicos de HTML

Conceptos Básicos de CSS

Aprende los conceptos básicos de CSS

Conceptos Básicos de JavaScript

Aprende los conceptos básicos de JavaScript

Conceptos Básicos SQL

Aprende los conceptos básicos de SQL

Conceptos Básicos de GIT

Aprende los conceptos básicos de GIT

Conceptos Básicos de UML

Aprende los conceptos básicos de UML

Refuerzo Academico de Herramientas de Productividad 2025