Manipulação de arquivos é uma habilidade essencial para qualquer programador Python. Seja lendo logs de sistemas, processando planilhas CSV ou trabalhando com APIs JSON, saber trabalhar com arquivos é fundamental. Neste guia completo, você aprenderá a ler, escrever e manipular os principais formatos de arquivo: TXT, CSV e JSON.
🎯 Por Que Manipular Arquivos?
Arquivos são a forma mais comum de persistir dados. No Universo Python, imagine arquivos como "cápsulas de dados" que navegam entre diferentes sistemas e épocas - permitindo que informações sobrevivam além da execução do programa.
- 📄 TXT - Arquivos de texto simples (logs, configurações)
- 📊 CSV - Planilhas e dados tabulares
- 🗂️ JSON - APIs, configurações estruturadas
📄 Arquivos de Texto (TXT)
Lendo Arquivos TXT
Python oferece várias formas de ler arquivos de texto. A mais segura é usar o gerenciador de contexto with, que fecha o arquivo automaticamente:
# Forma recomendada - with statement
with open('diario_bordo.txt', 'r', encoding='utf-8') as arquivo:
conteudo = arquivo.read()
print(conteudo)
# O arquivo é fechado automaticamente após o bloco with
Modos de Abertura
| Modo | Descrição | Cria se não existir? |
|---|---|---|
'r' |
Leitura (padrão) | ❌ Erro se não existir |
'w' |
Escrita (sobrescreve) | ✅ Sim |
'a' |
Append (adiciona ao final) | ✅ Sim |
'x' |
Criação exclusiva | ❌ Erro se existir |
'r+' |
Leitura e escrita | ❌ Erro se não existir |
Diferentes Formas de Leitura
# 1. Ler arquivo completo
with open('log.txt', 'r', encoding='utf-8') as f:
texto_completo = f.read()
print(texto_completo)
# 2. Ler linha por linha (eficiente para arquivos grandes)
with open('log.txt', 'r', encoding='utf-8') as f:
for linha in f:
print(linha.strip()) # strip() remove \n
# 3. Ler todas as linhas em uma lista (útil com técnicas de listas)
with open('log.txt', 'r', encoding='utf-8') as f:
linhas = f.readlines()
print(f"Total de linhas: {len(linhas)}")
# 4. Ler N caracteres
with open('log.txt', 'r', encoding='utf-8') as f:
primeiros_100 = f.read(100)
print(primeiros_100)
Escrevendo em Arquivos TXT
# Escrever (sobrescreve arquivo existente)
with open('relatorio.txt', 'w', encoding='utf-8') as f:
f.write("=== RELATÓRIO DE MISSÃO ===\n")
f.write("Data: 2026-01-05\n")
f.write("Status: Missão bem-sucedida\n")
# Adicionar ao final (append)
with open('relatorio.txt', 'a', encoding='utf-8') as f:
f.write("\nObservação adicional: Combustível baixo\n")
# Escrever múltiplas linhas (como vimos em strings)
linhas = [
"Comandante: Ana Silva\n",
"Copiloto: Carlos Santos\n",
"Destino: Marte\n"
]
with open('tripulacao.txt', 'w', encoding='utf-8') as f:
f.writelines(linhas)
Verificar se Arquivo Existe
import os
# Verificar existência
if os.path.exists('dados.txt'):
print("✅ Arquivo encontrado!")
else:
print("❌ Arquivo não existe!")
# Obter tamanho do arquivo
tamanho = os.path.getsize('dados.txt')
print(f"Tamanho: {tamanho} bytes")
# Verificar se é arquivo ou diretório
print(f"É arquivo? {os.path.isfile('dados.txt')}")
print(f"É diretório? {os.path.isdir('dados.txt')}")
📊 Arquivos CSV (Comma-Separated Values)
CSV é o formato padrão para planilhas e dados tabulares. Python tem um módulo nativo csv que facilita muito o trabalho:
Lendo CSV
import csv
# Ler CSV básico
with open('planetas.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.reader(arquivo)
# Pular cabeçalho
next(leitor)
for linha in leitor:
nome, distancia, massa = linha
print(f"{nome}: {distancia} km, {massa} kg")
# Ler CSV como dicionário (mais legível)
with open('planetas.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.DictReader(arquivo)
for planeta in leitor:
print(f"Nome: {planeta['nome']}")
print(f"Distância: {planeta['distancia_sol']}")
print("-" * 40)
Escrevendo CSV
import csv
# Escrever CSV com listas
dados = [
['Nome', 'Idade', 'Cidade'],
['Ana Silva', 28, 'São Paulo'],
['Bruno Costa', 35, 'Rio de Janeiro'],
['Carla Santos', 42, 'Belo Horizonte']
]
with open('usuarios.csv', 'w', newline='', encoding='utf-8') as arquivo:
escritor = csv.writer(arquivo)
escritor.writerows(dados)
# Escrever CSV com dicionários (técnica usada em dicionários)
usuarios = [
{'nome': 'Ana Silva', 'idade': 28, 'email': '[email protected]'},
{'nome': 'Bruno Costa', 'idade': 35, 'email': '[email protected]'},
{'nome': 'Carla Santos', 'idade': 42, 'email': '[email protected]'}
]
with open('usuarios.csv', 'w', newline='', encoding='utf-8') as arquivo:
campos = ['nome', 'idade', 'email']
escritor = csv.DictWriter(arquivo, fieldnames=campos)
escritor.writeheader() # Escreve cabeçalho
escritor.writerows(usuarios)
CSV com Diferentes Delimitadores
import csv
# CSV com ponto e vírgula (comum em Excel Brasil)
with open('dados.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.reader(arquivo, delimiter=';')
for linha in leitor:
print(linha)
# CSV com tabulação
with open('dados.tsv', 'r', encoding='utf-8') as arquivo:
leitor = csv.reader(arquivo, delimiter='\t')
for linha in leitor:
print(linha)
🗂️ Arquivos JSON (JavaScript Object Notation)
JSON é o formato mais usado para APIs e troca de dados estruturados. É praticamente idêntico aos dicionários Python!
Lendo JSON
import json
# Ler arquivo JSON
with open('configuracao.json', 'r', encoding='utf-8') as arquivo:
config = json.load(arquivo)
print(config['nome'])
print(config['versao'])
print(config['ativo'])
# Converter string JSON para dict
json_string = '{"nome": "Python", "versao": 3.12, "ativo": true}'
dados = json.loads(json_string)
print(type(dados)) #
Escrevendo JSON
import json
# Dicionário Python
nave = {
"nome": "USS Enterprise",
"tripulacao": 430,
"velocidade_maxima": 9.9,
"ativa": True,
"sistemas": ["propulsao", "armamento", "escudos"],
"comandante": {
"nome": "James T. Kirk",
"patente": "Capitão"
}
}
# Salvar em arquivo JSON
with open('nave.json', 'w', encoding='utf-8') as arquivo:
json.dump(nave, arquivo, indent=2, ensure_ascii=False)
# Converter dict para string JSON
json_string = json.dumps(nave, indent=2, ensure_ascii=False)
print(json_string)
Parâmetros Importantes do JSON
import json
dados = {"nome": "Python", "símbolo": "🐍"}
# indent - formata com indentação
print(json.dumps(dados, indent=4))
# ensure_ascii=False - permite caracteres especiais
print(json.dumps(dados, ensure_ascii=False))
# sort_keys - ordena chaves alfabeticamente
print(json.dumps(dados, sort_keys=True))
# Exemplo completo formatado
with open('dados.json', 'w', encoding='utf-8') as f:
json.dump(
dados,
f,
indent=4,
ensure_ascii=False,
sort_keys=True
)
🎯 Projeto Prático: Sistema de Log de Missões Espaciais
Vamos criar um sistema completo que trabalha com os 3 formatos de arquivo, usando conceitos de funções e POO:
import json
import csv
from datetime import datetime
import os
class SistemaLogMissoes:
"""Gerencia logs de missões espaciais em múltiplos formatos"""
def __init__(self, diretorio='logs'):
self.diretorio = diretorio
self._criar_diretorio()
def _criar_diretorio(self):
"""Cria diretório se não existir"""
if not os.path.exists(self.diretorio):
os.makedirs(self.diretorio)
print(f"📁 Diretório '{self.diretorio}' criado")
def registrar_missao_txt(self, comandante, destino, status):
"""Registra missão em arquivo TXT (log simples)"""
arquivo = os.path.join(self.diretorio, 'missoes.txt')
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
with open(arquivo, 'a', encoding='utf-8') as f:
f.write(f"[{timestamp}] Comandante: {comandante} | ")
f.write(f"Destino: {destino} | Status: {status}\n")
print(f"✅ Missão registrada em TXT")
def registrar_missao_csv(self, missao_dict):
"""Registra missão em CSV (dados tabulares)"""
arquivo = os.path.join(self.diretorio, 'missoes.csv')
arquivo_existe = os.path.exists(arquivo)
campos = ['data', 'comandante', 'destino', 'duracao_dias',
'tripulacao', 'status', 'combustivel_usado']
with open(arquivo, 'a', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=campos)
if not arquivo_existe:
writer.writeheader()
writer.writerow(missao_dict)
print(f"✅ Missão registrada em CSV")
def registrar_missao_json(self, missao_completa):
"""Registra missão completa em JSON (estrutura complexa)"""
arquivo = os.path.join(self.diretorio, 'missoes.json')
# Ler dados existentes
if os.path.exists(arquivo):
with open(arquivo, 'r', encoding='utf-8') as f:
try:
missoes = json.load(f)
except json.JSONDecodeError:
missoes = []
else:
missoes = []
# Adicionar nova missão
missoes.append(missao_completa)
# Salvar tudo
with open(arquivo, 'w', encoding='utf-8') as f:
json.dump(missoes, f, indent=2, ensure_ascii=False)
print(f"✅ Missão registrada em JSON")
def listar_missoes_txt(self):
"""Lista todas as missões do log TXT"""
arquivo = os.path.join(self.diretorio, 'missoes.txt')
if not os.path.exists(arquivo):
print("📭 Nenhuma missão registrada em TXT")
return
print("\n" + "="*60)
print("📋 LOG DE MISSÕES (TXT)")
print("="*60)
with open(arquivo, 'r', encoding='utf-8') as f:
for linha in f:
print(linha.strip())
def listar_missoes_csv(self):
"""Lista missões do CSV"""
arquivo = os.path.join(self.diretorio, 'missoes.csv')
if not os.path.exists(arquivo):
print("📭 Nenhuma missão registrada em CSV")
return
print("\n" + "="*60)
print("📊 RELATÓRIO DE MISSÕES (CSV)")
print("="*60)
with open(arquivo, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for missao in reader:
print(f"\n🚀 {missao['comandante']} → {missao['destino']}")
print(f" 📅 Data: {missao['data']}")
print(f" 👥 Tripulação: {missao['tripulacao']} pessoas")
print(f" ⏱️ Duração: {missao['duracao_dias']} dias")
print(f" ⛽ Combustível: {missao['combustivel_usado']}L")
print(f" ✅ Status: {missao['status']}")
def listar_missoes_json(self):
"""Lista missões completas do JSON"""
arquivo = os.path.join(self.diretorio, 'missoes.json')
if not os.path.exists(arquivo):
print("📭 Nenhuma missão registrada em JSON")
return
print("\n" + "="*60)
print("🗂️ ARQUIVO COMPLETO DE MISSÕES (JSON)")
print("="*60)
with open(arquivo, 'r', encoding='utf-8') as f:
missoes = json.load(f)
for i, missao in enumerate(missoes, 1):
print(f"\n📄 MISSÃO #{i}")
print(f" Nave: {missao['nave']['nome']}")
print(f" Comandante: {missao['comandante']['nome']} ({missao['comandante']['patente']})")
print(f" Destino: {missao['destino']}")
print(f" Status: {missao['status']}")
if missao.get('relatorio'):
print(f" 📝 Relatório: {missao['relatorio']}")
def estatisticas(self):
"""Mostra estatísticas dos logs"""
print("\n" + "="*60)
print("📊 ESTATÍSTICAS DO SISTEMA")
print("="*60)
# TXT
arquivo_txt = os.path.join(self.diretorio, 'missoes.txt')
if os.path.exists(arquivo_txt):
with open(arquivo_txt, 'r') as f:
linhas_txt = len(f.readlines())
print(f"📄 Logs TXT: {linhas_txt} entradas")
# CSV
arquivo_csv = os.path.join(self.diretorio, 'missoes.csv')
if os.path.exists(arquivo_csv):
with open(arquivo_csv, 'r') as f:
leitor = csv.reader(f)
linhas_csv = len(list(leitor)) - 1 # -1 por causa do cabeçalho
print(f"📊 Registros CSV: {linhas_csv} missões")
# JSON
arquivo_json = os.path.join(self.diretorio, 'missoes.json')
if os.path.exists(arquivo_json):
with open(arquivo_json, 'r') as f:
missoes_json = json.load(f)
print(f"🗂️ Missões JSON: {len(missoes_json)} completas")
# === USANDO O SISTEMA ===
sistema = SistemaLogMissoes()
# 1. Registrar log simples (TXT)
sistema.registrar_missao_txt(
comandante="Ana Silva",
destino="Marte",
status="Em andamento"
)
# 2. Registrar dados tabulares (CSV)
missao_csv = {
'data': '2026-01-05',
'comandante': 'Bruno Costa',
'destino': 'Júpiter',
'duracao_dias': 180,
'tripulacao': 6,
'status': 'Concluída',
'combustivel_usado': 45000
}
sistema.registrar_missao_csv(missao_csv)
# 3. Registrar estrutura completa (JSON)
missao_json = {
"data": "2026-01-05",
"nave": {
"nome": "USS Enterprise",
"modelo": "NCC-1701"
},
"comandante": {
"nome": "Carla Santos",
"patente": "Capitã"
},
"destino": "Alpha Centauri",
"tripulacao": 430,
"duracao_estimada_dias": 365,
"status": "Planejada",
"sistemas_criticos": ["propulsao", "escudos", "suporte_vital"],
"relatorio": "Missão de exploração científica com 3 objetivos principais"
}
sistema.registrar_missao_json(missao_json)
# Listar todos os formatos
sistema.listar_missoes_txt()
sistema.listar_missoes_csv()
sistema.listar_missoes_json()
# Estatísticas
sistema.estatisticas()
💡 Boas Práticas com Arquivos
- Sempre use 'with': Garante fechamento automático do arquivo
- Especifique encoding: Use
encoding='utf-8'para evitar problemas com acentos - Trate exceções: Arquivos podem não existir ou ter permissões negadas
- Use caminhos absolutos: Ou
os.path.join()para compatibilidade - Valide dados: Antes de escrever, especialmente em JSON
- Faça backup: Antes de sobrescrever arquivos importantes
import os
import shutil
from datetime import datetime
def salvar_com_backup(arquivo, dados):
"""Salva dados criando backup do arquivo original"""
# Criar backup se arquivo existir
if os.path.exists(arquivo):
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup = f"{arquivo}.backup_{timestamp}"
shutil.copy2(arquivo, backup)
print(f"💾 Backup criado: {backup}")
# Salvar novos dados
try:
with open(arquivo, 'w', encoding='utf-8') as f:
f.write(dados)
print(f"✅ Arquivo salvo: {arquivo}")
return True
except Exception as e:
print(f"❌ Erro ao salvar: {e}")
return False
⚠️ Tratamento de Erros
import json
def ler_json_seguro(arquivo):
"""Lê JSON com tratamento de erros"""
try:
with open(arquivo, 'r', encoding='utf-8') as f:
dados = json.load(f)
return dados
except FileNotFoundError:
print(f"❌ Arquivo '{arquivo}' não encontrado")
return None
except json.JSONDecodeError as e:
print(f"❌ JSON inválido: {e}")
return None
except PermissionError:
print(f"❌ Sem permissão para ler '{arquivo}'")
return None
except Exception as e:
print(f"❌ Erro inesperado: {e}")
return None
# Usando
dados = ler_json_seguro('config.json')
if dados:
print(f"✅ Dados carregados: {dados}")
else:
print("⚠️ Usando configuração padrão")
dados = {"default": True}
🚀 Próximos Passos
Agora que você domina manipulação de arquivos, explore tópicos relacionados:
- Strings em Python - Essencial para processar texto de arquivos
- Listas em Python - Trabalhe com múltiplas linhas
- Dicionários - Estrutura perfeita para JSON
- Funções - Organize código de manipulação
- POO em Python - Crie classes para gerenciar arquivos
- Pandas - Manipulação avançada de CSV e dados
- pathlib - Caminho moderno de arquivos
- Serialização com Pickle
Quer dominar Python completamente? Confira nosso curso completo de Python do zero ao avançado com projetos reais de processamento de dados!
📝 Resumo
Neste guia completo sobre manipulação de arquivos em Python, você aprendeu:
- ✅ Arquivos TXT - leitura, escrita e modos de abertura
- ✅ Arquivos CSV - trabalhar com planilhas e dados tabulares
- ✅ Arquivos JSON - estruturas complexas e APIs
- ✅ Gerenciador de contexto (with statement)
- ✅ Encoding e caracteres especiais
- ✅ Módulos os e shutil para operações de arquivo
- ✅ Projeto completo: Sistema de Log de Missões
- ✅ Boas práticas e tratamento de erros
- ✅ Backup e segurança de dados
Manipulação de arquivos é uma habilidade fundamental que você usará constantemente em projetos reais. Domine essas técnicas e você estará preparado para trabalhar com qualquer tipo de dados persistentes!