Introdução parte 3
Gerenciamento de Arquivo
O gerenciamento de arquivos em Python permite que você abra, leia, escreva, crie, edite e exclua arquivos de forma simples e direta, usando a função open()
e métodos associados. Ele serve para lidar com arquivos de texto, binários, logs, configurações, entre outros.
Abrindo um arquivo
A função básica é:
open(caminho, modo)
Os modos mais comuns são:
'r'
– leitura (read)'w'
– escrita (write, sobrescreve)'a'
– anexar (append, adiciona no fim)'x'
– criar (erro se já existir)'b'
– modo binário (usar junto:'rb'
,'wb'
)'+'
– leitura e escrita ('r+'
,'w+'
)
Leitura
Para ler um arquivo, podemos fazer:
with open("arquivo.txt", "r") as f:
conteudo = f.read()
print(conteudo)
Você também pode ler linha por linha:
with open("arquivo.txt") as f:
for linha in f:
print(linha.strip())
Escrita
Para escrever em um arquivo, podemos fazer:
with open("arquivo.txt", "w") as f:
f.write("Primeira linha\n")
f.write("Segunda linha\n")
O modo 'w'
apaga o conteúdo anterior. Se quiser manter o que já tem, use 'a'
:
with open("arquivo.txt", "a") as f:
f.write("Nova linha ao final\n")
Escrever várias linhas
Para escrever várias linhas em um arquivo, podemos fazer:
linhas = ["linha1\n", "linha2\n", "linha3\n"]
with open("arquivo.txt", "w") as f:
f.writelines(linhas)
Modo seguro: with
O with
é o jeito mais seguro de lidar com arquivos. Ele faz,
- Abre o arquivo
- Fecha automaticamente (mesmo com erro)
- Libera o recurso corretamente
Sem with
, você teria que fechar manualmente:
f = open("arquivo.txt", "r")
dados = f.read()
f.close()
Se você esquecer o close()
, o arquivo pode ficar bloqueado.
Leitura e escrita juntas
with open("arquivo.txt", "r+") as f:
conteudo = f.read()
f.seek(0)
f.write("Novo conteúdo\n")
O seek(0)
reposiciona o cursor no início do arquivo.
Arquivos binários
Para ler ou escrever arquivos binários (imagens, áudio, etc.):
with open("foto.jpg", "rb") as f:
dados = f.read()
with open("saida.jpg", "wb") as f:
f.write(dados)
Trabalhar com caminhos
Use o módulo os
ou pathlib
para criar caminhos seguros:
from pathlib import Path
arquivo = Path("dados") / "registro.txt"
with open(arquivo, "r") as f:
print(f.read())
Verificar se arquivo existe
import os
if os.path.exists("arquivo.txt"):
print("Arquivo existe")
Ou com Path
:
from pathlib import Path
if Path("arquivo.txt").is_file():
print("Existe")
Remover arquivos
import os
os.remove("arquivo.txt")
Ou:
from pathlib import Path
Path("arquivo.txt").unlink()
DocStrings
As docstrings (document strings) são strings de documentação usadas para explicar o propósito de um módulo, classe, função ou método em Python. Elas são escritas logo após a definição de algo (usando aspas triplas """
) e servem para documentar o código de forma clara e acessível, tanto para humanos quanto para ferramentas automáticas, como o help()
e geradores de documentação.
def somar(a, b):
"""Soma dois números e retorna o resultado."""
return a + b
Agora, se você fizer:
help(somar)
A saída será:
Help on function somar in module __main__:
somar(a, b)
Soma dois números e retorna o resultado.
class Conta:
"""Representa uma conta bancária com saldo."""
def __init__(self, saldo):
"""Inicializa a conta com o saldo informado."""
self.saldo = saldo
def depositar(self, valor):
"""Adiciona um valor ao saldo."""
self.saldo += valor
Docstring com descrição dos parâmetros
def dividir(a, b):
"""
Divide a por b.
Parâmetros:
a (float): O numerador.
b (float): O denominador (não pode ser zero).
Retorna:
float: O resultado da divisão.
Levanta:
ValueError: Se b for zero.
"""
if b == 0:
raise ValueError("O denominador não pode ser zero.")
return a / b
Enum
O enum.Enum
é uma forma de criar conjuntos de constantes nomeadas. Ele faz parte do módulo enum
, incluído na biblioteca padrão desde o Python 3.4. Usar enum.Enum
é útil quando você tem valores fixos e limitados que fazem sentido ter nomes simbólicos, como dias da semana, estados de um sistema, tipos de erro, etc. Ao invés de usar strings ou números soltos, você organiza essas opções em uma estrutura clara, segura e legível.
from enum import Enum
class Cor(Enum):
VERMELHO = 1
VERDE = 2
AZUL = 3
Agora você pode usar essas cores assim:
print(Cor.VERMELHO) # Cor.VERMELHO
print(Cor.VERMELHO.name) # VERMELHO
print(Cor.VERMELHO.value) # 1
Você pode iterar sobre os membros do Enum:
for cor in Cor:
print(cor.name, cor.value)
E também pode acessar assim:
Cor['VERMELHO'] # retorna Cor.VERMELHO
Cor(1) # retorna Cor.VERMELHO
Se você tentar acessar um valor que não existe, dá erro:
Cor(4) # ValueError
Um enum não é igual à string ou ao número diretamente:
Cor.VERMELHO == "VERMELHO" # False
Cor.VERMELHO == 1 # False
Só funciona assim:
Cor.VERMELHO.name == "VERMELHO" # True
Cor.VERMELHO.value == 1 # True
Datetime
O módulo datetime
serve para trabalhar com datas e horários, de forma precisa, estruturada e segura. Ele é parte da biblioteca padrão e fornece classes para representar:
- Data (
date
) - Hora (
time
) - Data e hora combinadas (
datetime
) - Diferença entre datas (
timedelta
) - Informações sobre fuso horário (
timezone
)
É uma ferramenta essencial para qualquer sistema que lide com datas, agendamentos, logs, relatórios ou controle de tempo.
Classe datetime
A mais usada é datetime.datetime
, que representa data + hora:
from datetime import datetime
agora = datetime.now()
print(agora) # Exemplo: 2025-06-21 14:36:00.123456
Você pode acessar partes específicas:
print(agora.year) # Ano
print(agora.month) # Mês
print(agora.day) # Dia
print(agora.hour) # Hora
print(agora.minute) # Minuto
print(agora.second) # Segundo
Criar uma data/hora específica
dt = datetime(2024, 12, 25, 10, 30)
print(dt) # 2024-12-25 10:30:00
Formatando datas
print(agora.strftime('%d/%m/%Y')) # 21/06/2025
print(agora.strftime('%H:%M:%S')) # 14:36:00
print(agora.strftime('%d de %B de %Y')) # 21 de June de 2025
Convertendo string para data
texto = '21/06/2025 14:30'
dt = datetime.strptime(texto, '%d/%m/%Y %H:%M')
print(dt) # 2025-06-21 14:30:00
Diferença entre datas: timedelta
from datetime import timedelta
agora = datetime.now()
amanha = agora + timedelta(days=1)
ontem = agora - timedelta(days=1)
print(amanha)
print(ontem)
Você pode usar timedelta
para somar/subtrair dias, horas, minutos, etc.
Comparando datas
data1 = datetime(2025, 6, 21)
data2 = datetime(2025, 6, 22)
if data2 > data1:
print("data2 é depois de data1")
Trabalhando com só data (date
) ou só hora (time
)
from datetime import date, time
d = date.today() # Somente data
t = time(14, 30) # Somente hora
print(d) # 2025-06-21
print(t) # 14:30:00
Fuso horário (timezone
)
O datetime
também suporta fuso horário com tzinfo
, mas isso pode ficar mais fácil com módulos como pytz
ou zoneinfo
(a partir do Python 3.9):
from datetime import timezone
agora_utc = datetime.now(timezone.utc)
print(agora_utc)
Timestamp
O timestamp é uma forma de representar um instante no tempo como um número inteiro ou decimal, geralmente contando segundos desde 1º de janeiro de 1970 às 00:00:00 UTC (conhecido como a Época Unix, ou Unix Epoch).
É uma medida precisa e padronizada que facilita o armazenamento, comparação e cálculo de datas e horários em sistemas computacionais.
Para que serve um timestamp
- Armazenar datas de forma compacta e sem ambiguidade.
- Comparar dois momentos facilmente (quem veio antes ou depois).
- Calcular a diferença de tempo entre eventos.
- Fazer ordenação cronológica (ex: logs, bancos de dados).
- Transmitir datas em APIs e sistemas distribuídos de forma universal (geralmente em UTC).
Obtendo um timestamp com Python
from datetime import datetime
agora = datetime.now()
timestamp = agora.timestamp()
print(timestamp) # Ex: 1729599326.894377
Esse número é a quantidade de segundos (com frações) desde a epoch. Se você quiser o timestamp inteiro (em segundos):
int(timestamp) # Ex: 1729599326
Convertendo timestamp de volta para datetime
from datetime import datetime
ts = 1729599326
data = datetime.fromtimestamp(ts)
print(data) # Ex: 2025-06-21 14:35:26 (horário local)
Para converter para horário UTC:
data_utc = datetime.utcfromtimestamp(ts)
print(data_utc) # Ex: 2025-06-21 17:35:26
Armazenar e comparar timestamps
Timestamps são ideais para:
- Armazenar tempos em banco de dados ou arquivos.
- Fazer cálculos simples com
>
ou<
para saber se um evento expirou, por exemplo. - Verificar tempo decorrido:
import time
inicio = time.time()
# ... alguma operação ...
fim = time.time()
print(f'Demorou {fim - inicio:.2f} segundos')
O timestamp()
sempre considera a data como se estivesse em UTC, mesmo que o datetime
tenha um fuso horário local. Para evitar confusão, use datetime.now(timezone.utc)
ou zoneinfo
para trabalhar com horários timezone-aware.