Strings & f-strings
Objetos str do Python representam texto Unicode. f-strings incorporam expressões diretamente em literais, tornando a formatação legível e rápida. Saber quando usar bytes evita bugs de codificação nas fronteiras do sistema.
Receita
name = "Ada"
score = 97.456
line = f"{name:>10} | {score:.1f}%"
multiline = f"""Relatório para {name}
Pontuação: {score:.2f}"""
raw_path = r"C:\new\data\file.txt"Quando usar isso:
- Construindo mensagens de log e saída voltada para o usuário
- Analisando texto delimitado (semelhante a CSV) com split/strip
- Codificando texto para I/O de rede ou arquivo
- Normalizando a entrada do usuário antes da validação
Exemplo de Trabalho
from pathlib import Path
def build_report(rows: list[dict[str, object]]) -> str:
header = f"{'name':<12} {'role':<10} {'score':>6}"
lines = [header, "-" * len(header)]
for row in rows:
lines.append(
f"{row['name']:<12} {row['role']:<10} {row['score']:>6.1f}"
)
return "\n".join(lines)
def slugify(text: str) -> str:
cleaned = text.strip().lower()
for ch in " /_":
cleaned = cleaned.replace(ch, "-")
while "--" in cleaned:
cleaned = cleaned.replace("--", "-")
return cleaned.strip("-")
def read_utf8_file(path: Path) -> str:
return path.read_text(encoding="utf-8")
def to_bytes_payload(message: str) -> bytes:
return message.encode("utf-8")
if __name__ == "__main__":
sample = [
{"name": "Ada", "role": "admin", "score": 98.2},
{"name": "Linus", "role": "dev", "score": 91.0},
]
print(build_report(sample))
print(slugify(" Hello World / API "))
print(to_bytes_payload("ok"))O que isso demonstra:
- Especificações de formato f-string alinham colunas (
:<12,:>6.1f) strip,lowerereplaceformam um pipeline simples de slugPath.read_text(encoding="utf-8")evita surpresas de codificação padrão da plataformastr.encodeproduzbytespara protocolos de comunicação
Mergulho Profundo
Como Funciona
- Sequências imutáveis - Strings não podem ser alteradas no local; métodos retornam novas strings.
- Pontos de código Unicode -
strdo Python 3 é Unicode; a indexação retorna strings de um ponto de código (na maioria das vezes). - Avaliação de f-string - Expressões são executadas em tempo de execução; o debug
f"{x=}"mostra o nome e o valor (3.8+). - bytes vs str -
bytesarmazena valores de 0 a 255; decodifique com um codec explícito. - Normalização -
unicodedata.normalizeajuda a comparar caracteres visualmente semelhantes.
Métodos Comuns
| Método | Propósito |
|---|---|
split(sep) | Quebra no delimitador |
join(iterable) | Concatena com separador |
strip(chars) | Trunca as extremidades |
replace(old, new) | Substitui substrings |
removeprefix/suffix | Trunca prefixo/sufixo conhecido (3.9+) |
Notas do Python
text = " hello "
text.strip().casefold() == "HELLO".casefold() # comparação insensível a maiúsculas/minúsculas
b"\xc3\xa9".decode("utf-8") # bytes -> str
"résumé".encode("ascii", errors="replace") # fallback com perdaArmadilhas
- Codificação implícita -
open("f.txt")usa o padrão local em alguns sistemas. Correção: Sempre passeencoding="utf-8". - Concatenando bytes e str -
b"hi" + "there"gera TypeError. Correção: Codifique ou decodifique explicitamente primeiro. - Construção de string com padrão mutável -
+=enorme em loops é lento para texto massivo. Correção: Colete em uma lista e use"".join(lines). - Aspas em f-string - Aspas aninhadas podem quebrar a análise. Correção: Use estilos de aspas diferentes ou variáveis.
- Comparando Unicode visualmente -
"café" != "café"com caracteres combinados diferentes. Correção: Normalize antes de comparar.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| f-strings | Maior parte da formatação | Necessita de template preguiçoso para catálogos de i18n |
str.format | Posição de templates a partir de configuração | Formatação inline simples |
Template | Substituição mais segura a partir de entrada do usuário | Necessidades completas de especificação de formato |
regex (re) | Extração de padrões complexos | split simples é suficiente |
FAQs
f-strings são mais rápidas que format()?
Geralmente sim - as expressões são avaliadas uma vez em tempo de execução com menos sobrecarga. Prefira f-strings para código novo.
Quando preciso de bytes em vez de str?
Protocolos de rede, formatos de arquivo binário e resumos criptográficos operam em bytes. Converta na fronteira.
Qual codificação devo usar como padrão?
UTF-8 para arquivos de texto, JSON HTTP e logs, a menos que uma especificação exija o contrário.
Como faço uma f-string multilinhas?
Use aspas triplas: f"""linha1\n{name}""". Novas linhas no literal são preservadas.
O que é uma string raw?
r"\\server\share" trata barras invertidas literalmente - útil para regex e caminhos do Windows na documentação.
Como formato separadores de milhar?
f"{1_000_000:,}" produz 1,000,000. Sublinhados em literais também são cosméticos para legibilidade.
f-strings podem chamar funções?
Sim: f"{len(items)} itens". Mantenha as expressões simples para legibilidade.
Como removo pontuação?
str.strip remove apenas as extremidades. Para todas as ocorrências, use replace ou re.sub.
O que faz casefold?
Normalização agressiva de maiúsculas/minúsculas para comparações - melhor que lower() para correspondência Unicode.
Como construo strings SQL com segurança?
Nunca interpole a entrada do usuário. Use consultas parametrizadas do seu driver de banco de dados ou ORM.
Relacionado
- Arquivos & I/O - leitura e escrita de texto codificado
- Números, Booleanos & Aritmética - especificações de formato numérico
- Compreensões & Expressões Geradoras - junções de strings a partir de iteráveis
- arrays, bytes & memoryview - buffers binários
Versões da Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.