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
# 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!
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
# 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)
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
# "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())
Saída:
Primeira linha
Segunda linha
Terceira linha
4. Formas de Ler Arquivos
Exemplo: Três Formas de Ler um Arquivo
# 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
Exemplo: Ferramenta de Backup de Arquivo (Dificuldade ⭐⭐)
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")
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
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)
Saída:
['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
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']}")
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
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)
Recomendado: pathlib (Python 3.4+)
Exemplo: Operações de Caminho com pathlib
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)
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
- Persistência de dados: Salve dados do programa em arquivos, restaure na próxima inicialização.
- Registro de log: Adicione informações de execução do programa a arquivos de log.
- Gerenciamento de configuração: Leia arquivos de configuração (
.ini,.json,.env). - Importação/exportação de dados: Troque dados com Excel/bancos de dados usando formato CSV.
- Processamento em lote de arquivos: Atravesse diretórios, modifique conteúdo de arquivos ou renomeie arquivos em lote.
❓ 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 usacp1252, macOS/Linux usautf-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 useos.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 useread()oureadlines()— eles carregam o arquivo inteiro na memória. Usefor line in file:para ler linha por linha, processando apenas uma linha de cada vez com uso mínimo de memória. Alternativamente, useread(1024)para ler um número específico de bytes por vez.
📖 Resumo
- Operações de arquivo em três etapas:
open()-> ler/escrever ->close() - A declaração
withgerencia o fechamento do arquivo automaticamente — a abordagem mais segura - Modos:
"r"leitura,"w"escrita,"a"adicionar - Métodos de leitura:
read()conteúdo completo,readlines()como lista,for line in flinha por linha - Módulo
csvpara E/S de arquivos CSV; suportaDictReader/DictWriter os.pathepathlibpara manipulação de caminhos de arquivo;pathlibé mais moderno- Sempre especifique
encoding="utf-8"para operações com arquivos de texto em português
📝 Atividades
-
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. -
Intermediário (Dificuldade ⭐⭐): Escreva um programa que leia o arquivo
usuarios.txtdo exercício anterior, analise cada linha, calcule e exiba a idade média dos usuários. Dica: Usesplit(",")para analisar,int()para converter idade. -
Avançado (Dificuldade ⭐⭐⭐): Escreva um programa "bloco de notas simples." Recursos:
add:título|conteúdopara adicionar uma nota (adicione anotas.csv),listpara listar todas as notas,search:palavra-chavepara buscar notas. Armazene em formato CSV (campos: título, conteúdo, data de criação). Dica: Usedatetime.now()para o timestamp atual.



