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 <a href="/blog/listas-python-manipulacao-completa">listas</a>)
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 <a href="/blog/strings-python-guia-completo">strings</a>)
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 <a href="/blog/dicionarios-python-guia-completo">dicionários</a>)
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))  # <class 'dict'>

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

  1. Sempre use 'with': Garante fechamento automático do arquivo
  2. Especifique encoding: Use encoding='utf-8' para evitar problemas com acentos
  3. Trate exceções: Arquivos podem não existir ou ter permissões negadas
  4. Use caminhos absolutos: Ou os.path.join() para compatibilidade
  5. Valide dados: Antes de escrever, especialmente em JSON
  6. 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? Compare os melhores cursos de Python e escolha uma formação 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!