0%
Manipulação de arquivos em Python

Arquivos

Gerencie com eficiência as entradas e saídas nos seus programas

10-15 min

Manipulação de arquivos em Python

A manipulação de arquivos é uma competência fundamental em programação, essencial para salvar dados, processar informações e automatizar tarefas. O Python oferece ferramentas poderosas e flexíveis para trabalhar com diferentes tipos de arquivos. Neste tutorial, vamos explorar como ler, escrever e manipular arquivos em Python.

Noções básicas de manipulação de arquivos

Abertura e fechamento de arquivos

Em Python, você usa a função open() para abrir um arquivo, que retorna um objeto de arquivo:

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

# Opérations sur le fichier
# ...

# Fermer le fichier
fichier.close()

A função open() recebe dois parâmetros principais:

  • O caminho do arquivo (pode ser absoluto ou relativo)
  • O modo de abertura (leitura, escrita etc.)

Modos de abertura de arquivos

O Python oferece vários modos para abrir arquivos:

  • 'r': Leitura (modo padrão)
  • 'w': Escrita (cria um novo arquivo ou sobrescreve um arquivo existente)
  • 'a': Acréscimo (adiciona conteúdo ao final de um arquivo existente)
  • 'b': Modo binário (por ex., 'rb' para ler em binário)
  • 't': Modo texto (padrão, por ex., 'rt' para ler texto)
  • '+': Modo de atualização (leitura e escrita, por ex., 'r+')

Uso do bloco with

A melhor prática para trabalhar com arquivos é usar o bloco with, que gerencia automaticamente o fechamento do arquivo, mesmo em caso de erro:

# 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

Leitura de arquivos

O Python oferece vários métodos para ler o conteúdo de um arquivo.

Ler o arquivo inteiro

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

Ler linha por linha

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)

Ler todas as linhas em uma 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

Percorrer um arquivo linha por linha (método eficiente para arquivos grandes)

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

Esse último método é particularmente eficiente para arquivos volumosos, pois carrega apenas uma linha por vez na memória.

Escrita em arquivos

Escrever 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.")

O método write() não adiciona automaticamente uma quebra de linha ao final do texto, portanto você deve adicioná-la explicitamente, se necessário, com \n.

Adicionar texto a um arquivo existente

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

Escrever várias linhas de uma vez

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

Gerenciamento de caminhos de arquivos

O módulo os.path fornece funções para trabalhar com caminhos de arquivos de forma compatível com diferentes sistemas operacionais:

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 operações mais avançadas com caminhos de arquivos, o módulo pathlib (disponível desde o Python 3.4) oferece uma interface orientada a objetos mais 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)

Trabalhando com arquivos CSV

Os arquivos CSV (Comma-Separated Values) são comumente usados para armazenar dados tabulares. O Python fornece o módulo csv para trabalhar facilmente com esses arquivos.

Ler um arquivo 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)

Ler um arquivo CSV como dicionário

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']}")

Escrever em um arquivo 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)

Escrever em um arquivo CSV usando dicionários

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)

Trabalhando com arquivos JSON

JSON (JavaScript Object Notation) é um formato leve de troca de dados. O Python fornece o módulo json para trabalhar com esse formato.

Ler um arquivo JSON

import json

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

Escrever em um arquivo 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

Manipulação de arquivos binários

Os arquivos binários contêm dados que não estão em formato de texto legível por humanos. O Python consegue lidar com eles usando o modo 'b'.

Ler um arquivo binário

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

Escrever em um arquivo binário

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)

Tratamento de exceções na manipulação de arquivos

Ao trabalhar com arquivos, é importante tratar as exceções que podem ocorrer:

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}")

Manipulação de pastas (diretórios)

O Python fornece funções para criar, listar e remover diretórios.

Criar um diretório

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 o conteúdo de um diretório

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)

Percorrer uma árvore de diretórios

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 arquivos temporários

O módulo tempfile permite criar arquivos e diretórios temporários:

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é

Entendendo as codificações de caracteres

Ao trabalhar com arquivos de texto, a codificação de caracteres é importante, principalmente para textos que contêm caracteres não 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 : éèêà")

As codificações mais comuns incluem:

  • 'utf-8': A codificação mais comum para a web e para sistemas modernos
  • 'latin-1' ou 'iso-8859-1': Uma codificação mais antiga para idiomas ocidentais
  • 'ascii': Limitada aos caracteres ASCII (0-127)
  • 'cp1252': A codificação padrão do Windows para idiomas ocidentais

Boas práticas

  1. Sempre use with para gerenciar arquivos, garantindo seu fechamento mesmo em caso de erro.
  2. Especifique a codificação ao abrir arquivos de texto para evitar problemas com caracteres especiais.
  3. Trate as exceções relacionadas a arquivos para tornar seu código mais robusto.
  4. Use caminhos relativos em vez de caminhos absolutos para garantir a portabilidade.
  5. Prefira pathlib para uma manipulação moderna e orientada a objetos de caminhos de arquivos.
  6. Use os módulos especializados (csv, json etc.) em vez de fazer o parsing manual dos formatos.

Conclusão

A manipulação de arquivos é uma competência essencial em programação Python. Seja trabalhando com arquivos de texto simples, formatos estruturados como CSV e JSON ou arquivos binários, o Python oferece ferramentas robustas e flexíveis para atender às suas necessidades.

Neste tutorial, exploramos os fundamentos de abertura, leitura e escrita de arquivos, bem como técnicas mais avançadas para trabalhar com diferentes formatos e lidar com situações complexas.

No próximo tutorial, vamos explorar as bibliotecas padrão do Python, que incluem diversos módulos poderosos para várias tarefas, inclusive recursos avançados de manipulação de arquivos.

Comentários

Os comentários são alimentados pelo GitHub Discussions

Conecte-se com o GitHub para participar da discussão

Link copiado!