0%
Manipulación de archivos en Python

Archivos

Gestiona eficazmente las entradas y salidas en tus programas

10-15 min

Manipulación de archivos en Python

La manipulación de archivos es una competencia fundamental en programación, esencial para guardar datos, procesar información y automatizar tareas. Python ofrece herramientas potentes y flexibles para trabajar con distintos tipos de archivos. En este tutorial exploraremos cómo leer, escribir y manipular archivos en Python.

Los fundamentos de la manipulación de archivos

Apertura y cierre de archivos

En Python, se utiliza la función open() para abrir un archivo, que devuelve un objeto de archivo:

# Ouvrir un fichier en mode lecture
fichier = open("mon_fichier.txt", "r")

# Opérations sur le fichier
# ...

# Fermer le fichier
fichier.close()

La función open() recibe dos parámetros principales:

  • La ruta del archivo (puede ser absoluta o relativa)
  • El modo de apertura (lectura, escritura, etc.)

Modos de apertura de archivos

Python ofrece varios modos para abrir archivos:

  • 'r': Lectura (modo por defecto)
  • 'w': Escritura (crea un archivo nuevo o sobrescribe un archivo existente)
  • 'a': Añadir (agrega contenido al final de un archivo existente)
  • 'b': Modo binario (p. ej., 'rb' para leer en binario)
  • 't': Modo texto (por defecto, p. ej., 'rt' para leer texto)
  • '+': Modo actualización (lectura y escritura, p. ej., 'r+')

Uso del bloque with

La mejor práctica para trabajar con archivos es utilizar el bloque with, que gestiona automáticamente el cierre del archivo, incluso en caso de error:

# Meilleure façon d'ouvrir un fichier
with open("mon_fichier.txt", "r") as fichier:
    # Opérations sur le fichier
    contenu = fichier.read()
    print(contenu)
# Le fichier est automatiquement fermé à la sortie du bloc with

Lectura de archivos

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

Leer el archivo completo

with open("mon_fichier.txt", "r") as fichier:
    contenu = fichier.read()
    print(contenu)

Leer línea por línea

with open("mon_fichier.txt", "r") as fichier:
    # Lire la première ligne
    premiere_ligne = fichier.readline()
    print(premiere_ligne)
    
    # Lire la deuxième ligne
    deuxieme_ligne = fichier.readline()
    print(deuxieme_ligne)

Leer todas las líneas en una lista

with open("mon_fichier.txt", "r") as fichier:
    lignes = fichier.readlines()
    for ligne in lignes:
        print(ligne.strip())  # strip() supprime les espaces et les sauts de ligne

Recorrer un archivo línea por línea (método eficaz para archivos grandes)

with open("mon_fichier.txt", "r") as fichier:
    for ligne in fichier:
        print(ligne.strip())

Este último método es especialmente eficaz para archivos voluminosos, ya que solo carga una línea a la vez en memoria.

Escritura en archivos

Escribir texto

with open("mon_fichier.txt", "w") as fichier:
    fichier.write("Bonjour, voici une ligne de texte.\n")
    fichier.write("Et voici une deuxième ligne.")

El método write() no añade automáticamente un salto de línea al final del texto, por lo que debes añadirlo explícitamente cuando sea necesario con \n.

Añadir texto a un archivo existente

with open("mon_fichier.txt", "a") as fichier:
    fichier.write("\nCette ligne est ajoutée à la fin du fichier.")

Escribir varias líneas a la vez

lignes = ["Ligne 1", "Ligne 2", "Ligne 3"]
with open("mon_fichier.txt", "w") as fichier:
    fichier.writelines(ligne + "\n" for ligne in lignes)

Gestión de rutas de archivos

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

import os.path

# Vérifier si un fichier existe
if os.path.exists("mon_fichier.txt"):
    print("Le fichier existe.")

# Vérifier si c'est un fichier ou un répertoire
if os.path.isfile("mon_fichier.txt"):
    print("C'est un fichier.")
if os.path.isdir("mon_dossier"):
    print("C'est un répertoire.")

# Obtenir le chemin absolu
chemin_absolu = os.path.abspath("mon_fichier.txt")
print(chemin_absolu)

# Joindre des parties de chemins
chemin_complet = os.path.join("dossier", "sous_dossier", "fichier.txt")
print(chemin_complet)

Para operaciones más avanzadas con rutas de archivos, el módulo pathlib (disponible desde Python 3.4) ofrece una interfaz orientada a objetos más moderna:

from pathlib import Path

# Créer un objet Path
chemin = Path("dossier/sous_dossier/fichier.txt")

# Vérifier si le fichier existe
if chemin.exists():
    print("Le fichier existe.")

# Obtenir le répertoire parent
parent = chemin.parent
print(parent)

# Créer un nouveau chemin en joignant
nouveau_chemin = parent / "autre_fichier.txt"
print(nouveau_chemin)

Trabajar con archivos CSV

Los archivos CSV (Comma-Separated Values) se utilizan habitualmente para almacenar datos tabulares. Python proporciona el módulo csv para trabajar fácilmente con estos archivos.

Leer un archivo CSV

import csv

with open("donnees.csv", "r", newline="") as fichier_csv:
    lecteur = csv.reader(fichier_csv)
    
    # Lire l'en-tête
    en_tete = next(lecteur)
    print(f"Colonnes : {en_tete}")
    
    # Lire les données
    for ligne in lecteur:
        print(ligne)

Leer un archivo CSV como diccionario

import csv

with open("donnees.csv", "r", newline="") as fichier_csv:
    lecteur = csv.DictReader(fichier_csv)
    
    for ligne in lecteur:
        print(f"Nom: {ligne['nom']}, Âge: {ligne['age']}")

Escribir en un archivo CSV

import csv

donnees = [
    ["Nom", "Âge", "Ville"],
    ["Alice", "30", "Paris"],
    ["Bob", "25", "Lyon"],
    ["Charlie", "35", "Marseille"]
]

with open("personnes.csv", "w", newline="") as fichier_csv:
    ecrivain = csv.writer(fichier_csv)
    ecrivain.writerows(donnees)

Escribir en un archivo CSV usando diccionarios

import csv

donnees = [
    {"nom": "Alice", "age": 30, "ville": "Paris"},
    {"nom": "Bob", "age": 25, "ville": "Lyon"},
    {"nom": "Charlie", "age": 35, "ville": "Marseille"}
]

with open("personnes.csv", "w", newline="") as fichier_csv:
    champs = ["nom", "age", "ville"]
    ecrivain = csv.DictWriter(fichier_csv, fieldnames=champs)
    
    ecrivain.writeheader()
    ecrivain.writerows(donnees)

Trabajar con archivos JSON

JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos. Python proporciona el módulo json para trabajar con este formato.

Leer un archivo JSON

import json

with open("donnees.json", "r") as fichier_json:
    donnees = json.load(fichier_json)
    print(donnees)

Escribir en un archivo JSON

import json

donnees = {
    "personnes": [
        {"nom": "Alice", "age": 30, "ville": "Paris"},
        {"nom": "Bob", "age": 25, "ville": "Lyon"},
        {"nom": "Charlie", "age": 35, "ville": "Marseille"}
    ]
}

with open("personnes.json", "w") as fichier_json:
    json.dump(donnees, fichier_json, indent=4)  # indent pour un format plus lisible

Manipulación de archivos binarios

Los archivos binarios contienen datos que no están en un formato de texto legible por humanos. Python puede gestionarlos utilizando el modo 'b'.

Leer un archivo binario

with open("image.jpg", "rb") as fichier_binaire:
    donnees = fichier_binaire.read()
    print(f"Taille du fichier : {len(donnees)} octets")

Escribir en un archivo binario

donnees_binaires = b'\x00\x01\x02\x03'  # Exemple de données binaires
with open("binaire.bin", "wb") as fichier_binaire:
    fichier_binaire.write(donnees_binaires)

Gestión de excepciones al manipular archivos

Cuando trabajes con archivos, es importante gestionar las excepciones que puedan producirse:

try:
    with open("fichier_inexistant.txt", "r") as fichier:
        contenu = fichier.read()
except FileNotFoundError:
    print("Le fichier n'existe pas.")
except PermissionError:
    print("Vous n'avez pas les permissions nécessaires pour accéder à ce fichier.")
except IsADirectoryError:
    print("C'est un répertoire, pas un fichier.")
except Exception as e:
    print(f"Une erreur inattendue s'est produite : {e}")

Manipulación de carpetas (directorios)

Python proporciona funciones para crear, listar y eliminar directorios.

Crear un directorio

import os

# Créer un seul répertoire
os.mkdir("nouveau_dossier")

# Créer des répertoires imbriqués
os.makedirs("parent/enfant/petit-enfant", exist_ok=True)  # exist_ok=True évite l'erreur si le dossier existe déjà

Listar el contenido de un directorio

import os

# Lister tous les fichiers et dossiers
contenu = os.listdir("mon_dossier")
print(contenu)

# Obtenir uniquement les fichiers
fichiers = [f for f in os.listdir("mon_dossier") if os.path.isfile(os.path.join("mon_dossier", f))]
print(fichiers)

Recorrer un árbol de directorios

import os

for dossier_racine, sous_dossiers, fichiers in os.walk("mon_dossier"):
    print(f"Dossier actuel : {dossier_racine}")
    print(f"Sous-dossiers : {sous_dossiers}")
    print(f"Fichiers : {fichiers}")
    print()

Uso de archivos temporales

El módulo tempfile permite crear archivos y directorios temporales:

import tempfile

# Créer un fichier temporaire
with tempfile.TemporaryFile() as tmp:
    tmp.write(b"Données temporaires")
    tmp.seek(0)  # Retourner au début du fichier
    data = tmp.read()
    print(data)
# Le fichier est automatiquement supprimé

# Créer un répertoire temporaire
with tempfile.TemporaryDirectory() as tmp_dir:
    print(f"Répertoire temporaire créé : {tmp_dir}")
# Le répertoire est automatiquement supprimé

Comprender las codificaciones de caracteres

Cuando trabajas con archivos de texto, la codificación de caracteres es importante, sobre todo para los textos que contienen caracteres no ASCII.

# Spécifier l'encodage lors de l'ouverture du fichier
with open("fichier_utf8.txt", "r", encoding="utf-8") as f:
    texte = f.read()

# Écrire avec un encodage spécifique
with open("nouveau_fichier.txt", "w", encoding="utf-8") as f:
    f.write("Texte avec des caractères spéciaux : éèêà")

Las codificaciones más habituales son:

  • 'utf-8': La codificación más habitual para la web y los sistemas modernos
  • 'latin-1' o 'iso-8859-1': Una codificación más antigua para las lenguas occidentales
  • 'ascii': Limitada a los caracteres ASCII (0-127)
  • 'cp1252': La codificación por defecto de Windows para las lenguas occidentales

Buenas prácticas

  1. Utiliza siempre with para gestionar los archivos, de modo que se cierren incluso en caso de error.
  2. Especifica la codificación al abrir archivos de texto para evitar problemas con los caracteres especiales.
  3. Gestiona las excepciones relacionadas con los archivos para hacer tu código más robusto.
  4. Utiliza rutas relativas en lugar de rutas absolutas para favorecer la portabilidad.
  5. Prefiere pathlib para una manipulación moderna y orientada a objetos de las rutas de archivos.
  6. Utiliza los módulos especializados (csv, json, etc.) en lugar de analizar manualmente los formatos.

Conclusión

La manipulación de archivos es una competencia esencial en la programación con Python. Tanto si trabajas con archivos de texto sencillos, con formatos estructurados como CSV y JSON, o con archivos binarios, Python ofrece herramientas robustas y flexibles para cubrir tus necesidades.

En este tutorial hemos explorado los fundamentos de la apertura, la lectura y la escritura de archivos, así como técnicas más avanzadas para trabajar con distintos formatos y gestionar situaciones complejas.

En el próximo tutorial exploraremos las bibliotecas estándar de Python, que incluyen numerosos módulos potentes para diversas tareas, entre ellas funcionalidades avanzadas de manipulación de archivos.

Comentarios

Los comentarios funcionan con GitHub Discussions

Inicia sesión con GitHub para participar en la discusión

¡Enlace copiado!