Entrada e Saída de Arquivos

Até agora, os dados do nosso programa só existiam na memória — feche o programa, e os dados são perdidos. E/S de arquivos permite que programas salvem dados em disco e os leiam de volta na próxima inicialização. Esta é uma capacidade fundamental para qualquer aplicação prática.


1. Abrindo e Fechando Arquivos

A operação básica de arquivo tem três etapas: abrir -> ler/escrever -> fechar.

Exemplo: Abrindo e Fechando um Arquivo Manualmente

PYTHON
# Escrever em um arquivo
file = open("hello.txt", "w", encoding="utf-8")
file.write("Olá, Mundo!")
file.close()

# Ler de um arquivo
file = open("hello.txt", "r", encoding="utf-8")
content = file.read()
file.close()

print(content)              # Olá, Mundo!
▶ Experimente
⚠️ Atenção: Sempre lembre de close()! Arquivos abertos consomem recursos do sistema. Esquecer de fechar pode levar à corrupção de arquivos ou exaustão de recursos. Mas não se preocupe — a próxima seção tem uma abordagem melhor.


2. A Declaração with (Context Manager)

A declaração with fecha automaticamente o arquivo ao final do bloco de código, sem precisar chamar close():

Exemplo: E/S Segura de Arquivo com with

PYTHON
# Escrever
with open("hello.txt", "w", encoding="utf-8") as f:
    f.write("Olá, Mundo!")

# Ler
with open("hello.txt", "r", encoding="utf-8") as f:
    content = f.read()

print(content)
▶ Experimente
💡 Sempre use with para operações de arquivo. É a forma mais segura e pytônica — o arquivo é corretamente fechado independentemente de ocorrer ou não uma exceção no bloco de código.


3. Modos de Abertura de Arquivo

O segundo parâmetro de open() é o modo:

Modo Significado Arquivo Existe Arquivo Não Existe
"r" Leitura (padrão) Lê normalmente Erro
"w" Escrita Limpa e escreve Cria
"a" Adicionar Adiciona ao final Cria
"x" Criação exclusiva Erro Cria
"r+" Leitura e escrita Legível e gravável Erro

Exemplo: Diferentes Modos de Abertura de Arquivo

PYTHON
# "w" — escrever (limpa e reescreve)
with open("teste.txt", "w", encoding="utf-8") as f:
    f.write("Primeira linha\n")
    f.write("Segunda linha\n")

# "a" — adicionar
with open("teste.txt", "a", encoding="utf-8") as f:
    f.write("Terceira linha\n")

# "r" — ler
with open("teste.txt", "r", encoding="utf-8") as f:
    print(f.read())
▶ Experimente

Saída:

TEXT
Primeira linha
Segunda linha
Terceira linha

4. Formas de Ler Arquivos

Exemplo: Três Formas de Ler um Arquivo

PYTHON
# Suponha conteúdo do arquivo:
# Primeira linha
# Segunda linha
# Terceira linha

# Método 1: read() — ler tudo de uma vez
with open("teste.txt", "r", encoding="utf-8") as f:
    content = f.read()
print(content)

# Método 2: readlines() — ler como lista
with open("teste.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
print(lines)                # ['Primeira linha\n', 'Segunda linha\n', 'Terceira linha\n']

# Método 3: linha por linha (recomendado)
with open("teste.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())  # strip() remove caracteres de nova linha
▶ Experimente

Exemplo: Ferramenta de Backup de Arquivo (Dificuldade ⭐⭐)

PYTHON
def backup_file(filename):
    """Cria uma cópia de backup de um arquivo"""
    try:
        with open(filename, "r", encoding="utf-8") as f:
            content = f.read()
        
        backup_name = filename + ".bak"
        with open(backup_name, "w", encoding="utf-8") as f:
            f.write(content)
        
        print(f"Backup criado: {backup_name}")
    except FileNotFoundError:
        print(f"Arquivo {filename} não existe!")

backup_file("teste.txt")
▶ Experimente

5. Lendo e Escrevendo Arquivos CSV

CSV (Valores Separados por Vírgula) é o formato de intercâmbio de dados mais comum. Python tem um módulo csv embutido:

Exemplo: E/S de Arquivo CSV

PYTHON
import csv

# Escrever CSV
data = [
    ["Nome", "Idade", "Cidade"],
    ["João Silva", 25, "São Paulo"],
    ["Maria Souza", 30, "Rio de Janeiro"],
    ["Pedro Santos", 22, "Belo Horizonte"],
]

with open("alunos.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerows(data)

# Ler CSV
with open("alunos.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
▶ Experimente

Saída:

TEXT
['Nome', 'Idade', 'Cidade']
['João Silva', '25', 'São Paulo']
['Maria Souza', '30', 'Rio de Janeiro']
['Pedro Santos', '22', 'Belo Horizonte']

Usando DictReader/DictWriter (Mais Intuitivo)

Exemplo: DictReader/DictWriter para CSV

PYTHON
import csv

# Escrever
data = [
    {"name": "João Silva", "age": 25, "city": "São Paulo"},
    {"name": "Maria Souza", "age": 30, "city": "Rio de Janeiro"},
]

with open("alunos_dict.csv", "w", newline="", encoding="utf-8") as f:
    fieldnames = ["name", "age", "city"]
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()       # Escrever cabeçalho
    writer.writerows(data)     # Escrever linhas de dados

# Ler
with open("alunos_dict.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(f"{row['name']} — {row['age']} anos, de {row['city']}")
▶ Experimente

6. Manipulação de Caminhos

Use os.path ou pathlib para manipulação de caminhos de arquivo — mais seguro que concatenação de strings:

Exemplo: Manipulação de Caminhos com os.path

PYTHON
import os

# Obter diretório atual
print(os.getcwd())          # /projeto

# Juntar caminhos (lida automaticamente com separadores)
path = os.path.join("data", "files", "teste.txt")
print(path)                 # data/files/teste.txt

# Verificar se caminho existe
print(os.path.exists("teste.txt"))          # True/False
print(os.path.isfile("teste.txt"))          # É um arquivo?
print(os.path.isdir("data"))               # É um diretório?

# Obter informações do arquivo
print(os.path.getsize("teste.txt"))         # Tamanho do arquivo em bytes

# Listar conteúdo do diretório
for f in os.listdir("."):
    print(f)
▶ Experimente

Recomendado: pathlib (Python 3.4+)

Exemplo: Operações de Caminho com pathlib

PYTHON
from pathlib import Path

# Criar um caminho
p = Path("data/files/teste.txt")

# Informações do caminho
print(p.name)               # teste.txt (nome do arquivo)
print(p.stem)               # teste (sem extensão)
print(p.suffix)             # .txt (extensão)
print(p.parent)             # data/files (diretório pai)

# Ler/escrever arquivo (conciso)
p = Path("hello.txt")
p.write_text("Olá, Mundo!", encoding="utf-8")
content = p.read_text(encoding="utf-8")
print(content)              # Olá, Mundo!

# Travessia recursiva
for py_file in Path(".").rglob("*.py"):
    print(py_file)
▶ Experimente
💡 pathlib é a forma recomendada de lidar com caminhos em Python 3.4+. É mais orientada a objetos e intuitiva que os.path. Para novos projetos, use pathlib.


Casos de Uso Comuns


❓ Perguntas Frequentes

P: Preciso sempre escrever encoding="utf-8"? R: Em ambientes de língua portuguesa, é fortemente recomendado toda vez. A codificação padrão do Python varia por sistema operacional — Windows usa cp1252, macOS/Linux usa utf-8. Sem especificar, processar arquivos de texto em português no Windows pode resultar em saída ilegível. Crie o hábito de especificar a codificação para tranquilidade multiplataforma. P: O modo "w" limpa o conteúdo existente do arquivo. Como evitar sobrescritas acidentais? R: Use o modo "x" (criação exclusiva) — se o arquivo já existir, levanta um erro em vez de limpá-lo. Ou use os.path.exists() para verificar primeiro. Dados são preciosos — pense duas vezes antes de escrever em um arquivo. P: Como ler arquivos muito grandes (centenas de MB)? R: Não use read() ou readlines() — eles carregam o arquivo inteiro na memória. Use for line in file: para ler linha por linha, processando apenas uma linha de cada vez com uso mínimo de memória. Alternativamente, use read(1024) para ler um número específico de bytes por vez.


📖 Resumo


📝 Atividades

  1. Iniciante (Dificuldade ⭐): Escreva um programa que aceite o nome e a idade de um usuário e os salve em um arquivo usuarios.txt (um usuário por linha, formato: nome,idade). Adicione novos registros a cada execução sem sobrescrever dados existentes.

  2. Intermediário (Dificuldade ⭐⭐): Escreva um programa que leia o arquivo usuarios.txt do exercício anterior, analise cada linha, calcule e exiba a idade média dos usuários. Dica: Use split(",") para analisar, int() para converter idade.

  3. Avançado (Dificuldade ⭐⭐⭐): Escreva um programa "bloco de notas simples." Recursos: add:título|conteúdo para adicionar uma nota (adicione a notas.csv), list para listar todas as notas, search:palavra-chave para buscar notas. Armazene em formato CSV (campos: título, conteúdo, data de criação). Dica: Use datetime.now() para o timestamp atual.

100%