Python Formatação
Esta é a página de consulta da mini-linguagem de formatação do Python: os códigos que vão depois dos dois-pontos dentro das chaves de uma f-string, como o >10.2f de f"{preco:>10.2f}". Com eles você alinha colunas, fixa as casas decimais, põe separador de milhar, mostra porcentagens, números em binário e datas no formato brasileiro. A explicação passo a passo das f-strings está na aula f-strings: Formatando Textos; aqui ficam as tabelas para consultar.
- Exemplo é uma f-string que você pode digitar no modo interativo (
>>>). - Resultado é o que o Python 3.14.4 respondeu no computador da Ana, mostrado entre aspas, como o modo interativo mostra, para você enxergar os espaços. Com
print(), as aspas não aparecem. - Os exemplos usam estas variáveis:
preco = 1234.5,nome = "Ana",n = 42,x = -7.25elargura = 8. - O
|no fim de alguns exemplos é só uma "parede", para mostrar onde o espaço reservado termina.
Pule direto para o que você procura:
- A anatomia de uma especificação
- Largura e alinhamento · Preenchimento e zeros · Sinal
- Casas decimais (precisão) · Separador de milhar
- Os tipos: f, %, e, g, b, o, x, c…
- Largura variável,
!re o=de depuração - Datas e horas (strftime)
- O jeito brasileiro: 1.234,50
- Os jeitos antigos:
.format()e%· Erros comuns
A anatomia de uma especificação
Dentro das chaves vem o valor, dois-pontos e a especificação (em inglês, format spec). Cada parte é opcional, mas a ordem é fixa:
>>> preco = 1234.5
>>> f"{preco:>10.2f}"
' 1234.50'
- preco
- O valor a formatar (uma variável, uma conta, uma chamada de função).
- :
- Separa o valor da especificação.
- >
- Alinhamento: à direita.
- 10
- Largura: o resultado ocupa pelo menos 10 posições.
- .2
- Precisão: 2 casas decimais.
- f
- Tipo: número com casas decimais fixas (fixed point).
A ordem completa, como na documentação oficial:
| Posição | Parte | Valores | Exemplo |
|---|---|---|---|
| 1 | preenchimento | qualquer caractere (só junto com um alinhamento) | * em *^9 |
| 2 | alinhamento | < > ^ = | > |
| 3 | sinal | + - espaço | + |
| 4 | z | transforma -0.0 em 0.0 | z.1f |
| 5 | # | prefixo 0b, 0o, 0x | #x |
| 6 | 0 | completa com zeros | 05 |
| 7 | largura | um número | 10 |
| 8 | agrupamento | , ou _ | , |
| 9 | precisão | . e um número | .2 |
| 10 | tipo | s d f e g % b o x X c n… | f |
Um exemplo com quase tudo: f"{1234.5:12,.2f}|" (largura 12, separador de milhar, 2 casas) dá ' 1,234.50|'.
O mesmo código funciona fora das f-strings, na função format() e no método .format(): format(1234.5, ",.2f") dá '1,234.50'.
Largura e alinhamento
A largura é o número mínimo de posições. Se o valor for menor, o resto vira espaço; se for maior, nada é cortado. Sem alinhamento, textos ficam à esquerda e números à direita.
| Código | O que faz | Exemplo | Resultado |
|---|---|---|---|
N | Largura N, alinhamento padrão (texto à esquerda) | f"{nome:8}|" | 'Ana |' |
N | Largura N, alinhamento padrão (número à direita) | f"{n:8}|" | ' 42|' |
<N | À esquerda | f"{nome:<8}|" | 'Ana |' |
>N | À direita | f"{nome:>8}|" | ' Ana|' |
^N | Centralizado (sobrando um espaço, ele vai para a direita) | f"{nome:^8}|" | ' Ana |' |
=N | Só para números: o sinal fica na ponta esquerda e os espaços vêm depois dele | f"{x:=10}|" | '- 7.25|' |
É assim que se monta uma tabela alinhada na tela:
produtos = [("Pão francês", 0.75, 12), ("Leite", 5.5, 2), ("Queijo minas", 42.9, 1)]
print(f"{'Produto':<14}{'Preço':>9}{'Qtd':>5}{'Total':>10}")
print("-" * 38)
soma = 0
for nome, preco, qtd in produtos:
total = preco * qtd
soma = soma + total
print(f"{nome:<14}{preco:>9.2f}{qtd:>5}{total:>10.2f}")
print("-" * 38)
print(f"{'TOTAL':<28}{soma:>10.2f}")
$ python3 tabela.py Produto Preço Qtd Total -------------------------------------- Pão francês 0.75 12 9.00 Leite 5.50 2 11.00 Queijo minas 42.90 1 42.90 -------------------------------------- TOTAL 62.90
Experimente: troque as larguras (14, 9, 5, 10) e os alinhamentos (<, >, ^) e veja a tabela mudar. Tente acrescentar um produto com nome comprido: o que acontece quando ele passa de 14 letras?
produtos = [("Pão francês", 0.75, 12), ("Leite", 5.5, 2), ("Queijo minas", 42.9, 1)]
print(f"{'Produto':<14}{'Preço':>9}{'Qtd':>5}{'Total':>10}")
print("-" * 38)
soma = 0
for nome, preco, qtd in produtos:
total = preco * qtd
soma = soma + total
print(f"{nome:<14}{preco:>9.2f}{qtd:>5}{total:>10.2f}")
print("-" * 38)
print(f"{'TOTAL':<28}{soma:>10.2f}")
Preenchimento e zeros
Em vez de espaço, o espaço vazio pode ser preenchido com qualquer caractere. Ele vem logo antes do alinhamento, que fica obrigatório.
| Código | O que faz | Exemplo | Resultado |
|---|---|---|---|
*^9 | Centraliza em 9 posições, preenchendo com * | f"{nome:*^9}" | '***Ana***' |
.<10 | Pontinhos depois do texto (como num índice de livro) | f"{nome:.<10}" | 'Ana.......' |
0N | Número com zeros à esquerda, até N posições | f"{n:05}" | '00042' |
0>N | O mesmo, escrito com preenchimento | f"{n:0>5}" | '00042' |
02 | Horas e minutos com dois algarismos | f"{7:02}:{5:02}" | '07:05' |
0N com sinal | Os zeros entram depois do sinal | f"{x:010}" | '-000007.25' |
+0N.2f | Sinal, zeros e casas decimais juntos | f"{12.5:+08.2f}" | '+0012.50' |
08b | Binário com 8 algarismos | f"{5:08b}" | '00000101' |
Sinal
| Código | O que faz | Exemplo | Resultado |
|---|---|---|---|
- | Sinal só nos negativos (é o padrão) | f"{n:-}" | '42' |
+ | Sinal sempre, + ou - | f"{n:+}", f"{x:+}" | '+42', '-7.25' |
| espaço | Um espaço no lugar do + (os positivos ficam alinhados com os negativos) | f"{n: }", f"{x: }" | ' 42', '-7.25' |
z | Um número que, arredondado, vira -0.0 aparece como 0.0 | f"{-0.0001:.1f}", f"{-0.0001:z.1f}" | '-0.0', '0.0' |
A opção z existe desde o Python 3.11, e o _ desde o 3.6. Tudo o que está nesta página funciona no 3.13 do Debian, menos o agrupamento das casas decimais (seção Separador de milhar), que é do 3.14.
Casas decimais (precisão)
A precisão é um ponto seguido de um número. O que ela faz depende do tipo:
| Código | O que faz | Exemplo | Resultado |
|---|---|---|---|
.2f | Exatamente 2 casas decimais (arredonda) | f"{3.14159:.2f}" | '3.14' |
.2f num inteiro | Acrescenta as casas | f"{7:.2f}" | '7.00' |
.0f | Sem casas decimais | f"{3.14159:.0f}" | '3' |
.0f no meio | Como o round(): no meio exato, vai para o par | f"{2.5:.0f}" | '2' |
.3 (sem tipo) | 3 algarismos no total, não 3 casas | f"{3.14159:.3}" | '3.14' |
| Se não couber, passa para notação científica | f"{1234.5:.3}" | '1.23e+03' | |
.N num texto | Corta o texto em N letras | f"{'Conceição':.5}" | 'Conce' |
.{v} | A precisão vinda de uma variável | f"{3.14159:.{2}f}" | '3.14' |
Por que 2.5 vira 2, e não 3? É o "arredondamento do banqueiro", explicado na aula Funções Embutidas (seção do round()).
Separador de milhar
O , e o _ agrupam os algarismos de 3 em 3. O separador sai sempre no padrão americano (vírgula no milhar, ponto nos decimais); para o padrão brasileiro, veja O jeito brasileiro.
| Código | O que faz | Exemplo | Resultado |
|---|---|---|---|
, | Vírgula a cada 3 algarismos | f"{1234567:,}" | '1,234,567' |
_ | Sublinhado a cada 3 algarismos | f"{1234567:_}" | '1_234_567' |
,.2f | Milhar e 2 casas | f"{1234567.891:,.2f}" | '1,234,567.89' |
_.2f | O mesmo com sublinhado | f"{1234567.891:_.2f}" | '1_234_567.89' |
+,.2f | Com o sinal | f"{-1234.5:+,.2f}" | '-1,234.50' |
_b, _x | Em binário e hexadecimal, o _ agrupa de 4 em 4 | f"{255:_b}", f"{1234567:_x}" | '1111_1111', '12_d687' |
., 3.14 | Agrupa as casas decimais | f"{123456789.123456789:.,}" | '123456789.123,456,79' |
,._ 3.14 | Vírgula na parte inteira, sublinhado nas casas | f"{123456789.123456789:,._}" | '123,456,789.123_456_79' |
.6_f 3.14 | 6 casas, agrupadas | f"{3.14159265:.6_f}" | '3.141_593' |
Os tipos
A letra do fim diz como o valor vai ser escrito.
| Tipo | Nome | Exemplo | Resultado |
|---|---|---|---|
s | Texto (o padrão para textos) | f"{nome:s}" | 'Ana' |
d | Inteiro em decimal (o padrão para int) | f"{n:d}" | '42' |
f | Casas decimais fixas (6, se não disser a precisão) | f"{preco:f}" | '1234.500000' |
% | Porcentagem: multiplica por 100 e põe o % | f"{0.256:.1%}" | '25.6%' |
f"{0.256:.0%}", f"{1:.0%}" | '26%', '100%' | ||
| sem precisão, 6 casas | f"{0.256:%}" | '25.600000%' | |
e / E | Notação científica (e+08 = "vezes 10 elevado a 8") | f"{299792458:.2e}" | '3.00e+08' |
f"{299792458:e}", f"{0.000123:.2E}" | '2.997925e+08', '1.23E-04' | ||
g | "Geral": decimal ou científica, o que ficar mais curto | f"{1234.5:g}", f"{299792458:g}" | '1234.5', '2.99792e+08' |
f"{0.0000123:g}" | '1.23e-05' | ||
b | Binário (base 2) | f"{255:b}" | '11111111' |
o | Octal (base 8) | f"{255:o}" | '377' |
x / X | Hexadecimal (base 16), letras minúsculas / maiúsculas | f"{255:x}", f"{255:X}" | 'ff', 'FF' |
#b, #o, #x | Com o prefixo da base | f"{255:#b}", f"{255:#o}", f"{255:#x}" | '0b11111111', '0o377', '0xff' |
c | O caractere daquele número (como o chr()) | f"{65:c}" | 'A' |
n | Como d ou g, mas com o separador do idioma configurado (veja O jeito brasileiro) | f"{1234567:n}" | depende do locale |
Largura variável, !r e o = de depuração
| Escrita | O que faz | Exemplo | Resultado |
|---|---|---|---|
{v:>{largura}} | Chaves dentro da especificação: a largura vem de uma variável | f"{nome:>{largura}}|" | ' Ana|' |
!r | Mostra o valor como no código (com aspas, usando repr()) | f"{nome!r}" | "'Ana'" |
!s | Usa str() (o padrão) | f"{nome!s}" | 'Ana' |
{v=} | Mostra o nome, o = e o valor: ótimo para depurar | f"{preco=}" | 'preco=1234.5' |
{v = :.2f} | Os espaços em volta do = aparecem na saída; a especificação vem depois | f"{preco = :.2f}" | 'preco = 1234.50' |
{{ e }} | Uma chave de verdade no texto | f"{{n}} vale {n}" | '{n} vale 42' |
Datas e horas (strftime)
Com datas do módulo datetime (aula Datas e Horas), a especificação é outra: os códigos de %, os mesmos do método .strftime() (string format time, "formatar o tempo como texto"). Os exemplos usam data = datetime(2026, 10, 18, 14, 30, 5), um domingo, às 14h30min05s.
| Código | O que é | Exemplo | Resultado |
|---|---|---|---|
%d/%m/%Y | Dia, mês e ano com 4 algarismos: o formato brasileiro | f"{data:%d/%m/%Y}" | '18/10/2026' |
%y | Ano com 2 algarismos | f"{data:%d/%m/%y %H:%M}" | '18/10/26 14:30' |
%Y-%m-%d | O formato internacional (ISO 8601), bom para nomes de arquivo | f"{data:%Y-%m-%d}" | '2026-10-18' |
%H:%M:%S | Hora (0 a 23), minuto e segundo | f"{data:%H:%M:%S}" | '14:30:05' |
%I e %p | Hora de 1 a 12 e AM/PM | f"{data:%I:%M %p}" | '02:30 PM' |
%A / %a | Dia da semana, completo / abreviado | f"{data:%A}" / f"{data:%a}" | 'Sunday' / 'Sun' (veja abaixo) |
%B / %b | Nome do mês, completo / abreviado | f"{data:%B}" / f"{data:%b}" | 'October' / 'Oct' |
%j | Dia do ano (1 a 366) | f"{data:%j}" | '291' |
%U | Semana do ano (começando no domingo) | f"{data:%U}" | '42' |
%% | Um % de verdade | f"{data:%%}" | '%' |
%-d, %-m | Sem o zero da frente. Funciona no Linux da Ana e no editor do guia, mas depende do sistema: não conte com ele em todo computador | f"{date(2026, 3, 5):%-d/%-m}" | '5/3' |
.strftime() | O mesmo, como método | data.strftime("%d/%m/%Y") | '18/10/2026' |
Mesmo no computador da Ana, que está em português, %A e %B dão Sunday e October: o Python começa sempre no idioma "neutro" (em inglês). Para usar o idioma do sistema, chame locale.setlocale(locale.LC_ALL, "") no começo do programa:
import locale
from datetime import datetime
locale.setlocale(locale.LC_ALL, "")
data = datetime(2026, 10, 18, 14, 30, 5)
print(f"{data:%A, %d de %B de %Y}")
print(f"{data:%x %X}")
$ python3 data_pt.py domingo, 18 de outubro de 2026 18/10/2026 14:30:05
(%x e %X são a data e a hora no formato do idioma.) No editor do guia, que roda o Python no navegador, o setlocale não dá erro, mas os nomes continuam em inglês. Se você precisa dos nomes em português em qualquer lugar, use uma lista sua: ["segunda", "terça", …][data.weekday()].
O jeito brasileiro: 1.234,50
No Brasil, o milhar é separado por ponto e os decimais por vírgula, o contrário do que o ,.2f faz. Há dois caminhos.
1. Trocar os caracteres
Formate no padrão americano e depois troque vírgula por ponto e ponto por vírgula. O método .translate() faz a troca dupla de uma vez (com .replace(), é preciso um caractere intermediário, senão a segunda troca desfaz a primeira):
def brl(valor):
texto = f"{valor:,.2f}"
return "R$ " + texto.translate(str.maketrans(",.", ".,"))
print(brl(1234567.891))
print(brl(0.5))
print(brl(-42))
$ python3 brl.py R$ 1.234.567,89 R$ 0,50 R$ -42,00
Escrita (com valor = 1234567.891) | Resultado |
|---|---|
f"{valor:,.2f}" | '1,234,567.89' |
f"{valor:,.2f}".translate(str.maketrans(",.", ".,")) | '1.234.567,89' |
f"{valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") | '1.234.567,89' |
f"{valor:_.2f}".replace(".", ",").replace("_", ".") | '1.234.567,89' |
2. Usar o idioma do sistema (locale)
Com o locale configurado para português do Brasil (como no computador da Ana), o módulo locale formata do jeito brasileiro, até com o R$:
import locale
locale.setlocale(locale.LC_ALL, "")
valor = 1234567.891
print(locale.currency(valor, grouping=True))
print(locale.format_string("%.2f", valor, grouping=True))
print(f"{1234567:n}")
$ python3 br.py R$ 1.234.567,89 1.234.567,89 1.234.567
O locale depende da configuração do computador: no computador de outra pessoa (ou num servidor em inglês), o mesmo programa mostra outra coisa. No editor do guia, por exemplo, o locale.currency termina em ValueError: Currency formatting is not possible using the 'C' locale. A troca de caracteres dá sempre o mesmo resultado. Para um programa que sempre vai mostrar reais, a troca é a escolha mais segura.
Missão: a função mostra os preços no formato americano. Mude a função brl para mostrar R$ 1.234,50 e R$ 0,99: duas casas, ponto no milhar e vírgula nos decimais.
def brl(valor):
return f"R$ {valor}"
print(brl(1234.5))
print(brl(0.99))
def brl(valor):
texto = f"{valor:,.2f}"
return "R$ " + texto.translate(str.maketrans(",.", ".,"))
print(brl(1234.5))
print(brl(0.99))
Os jeitos antigos: .format() e %
Antes das f-strings (Python 3.6), formatava-se de outros dois jeitos, que você ainda encontra em muito código. O .format() usa a mesma mini-linguagem desta página; o % usa códigos parecidos, mas mais limitados.
| Jeito | Exemplo | Resultado |
|---|---|---|
| f-string (prefira) | f"{3.5:>8.2f}" | ' 3.50' |
.format() | "{:>8.2f}".format(3.5) | ' 3.50' |
"{} tem {} anos".format("Ana", 30) | 'Ana tem 30 anos' | |
format() | format(1234.5, ",.2f") | '1,234.50' |
% (o mais antigo) | "%.2f" % 3.14159 | '3.14' |
"%5d|" % 42 | ' 42|' | |
"%s tem %d anos" % ("Ana", 30) | 'Ana tem 30 anos' |
Erros comuns
A especificação precisa combinar com o tipo do valor. Quando não combina, vem um ValueError (erro de valor). No modo interativo:
$ python3 -q
>>> f"{'Ana':.2f}"
Traceback (most recent call last):
File "<python-input-0>", line 1, in <module>
f"{'Ana':.2f}"
^^^^^^^^^^^
ValueError: Unknown format code 'f' for object of type 'str'
>>> f"{3.5:d}"
Traceback (most recent call last):
File "<python-input-1>", line 1, in <module>
f"{3.5:d}"
^^^^^^^
ValueError: Unknown format code 'd' for object of type 'float'
>>> exit()
| Exemplo | Mensagem | O que houve |
|---|---|---|
f"{'Ana':.2f}" | ValueError: Unknown format code 'f' for object of type 'str' | "Código f desconhecido para um str." O valor é um texto (muitas vezes, o que veio do input()): converta com float() antes |
f"{3.5:d}" | ValueError: Unknown format code 'd' for object of type 'float' | d é só para inteiros. Use .0f, ou int() antes |
f"{42:.2s}" | ValueError: Unknown format code 's' for object of type 'int' | s é só para textos |
f"{'Ana':+}" | ValueError: Sign not allowed in string format specifier | "Sinal não permitido para textos" |
f"{1234:,_}" | ValueError: Cannot specify both ',' and '_'. | "Não dá para usar , e _ juntos" (na mesma parte do número) |
f"{'Ana':05}" | sem erro: 'Ana00' | O 0 num texto completa com zeros à direita. Provavelmente não era o que você queria |
f"{'18/10/2026':%d/%m/%Y}" | ValueError: Invalid format specifier '%d/%m/%Y' for object of type 'str' | Os códigos de % só funcionam com objetos date/datetime; converta o texto com datetime.strptime() |
Resumo
- A ordem da especificação é fixa: preenchimento, alinhamento, sinal,
z,#,0, largura, agrupamento, precisão, tipo. Ex.:*>+12,.2f. - Alinhamento:
<esquerda,>direita,^centro. Textos ficam à esquerda e números à direita por padrão. .2f= 2 casas;,ou_= separador de milhar;.1%= porcentagem;b/o/x= outras bases.- Datas usam os códigos
%:f"{data:%d/%m/%Y}". Nomes de dia e mês saem em inglês semlocale.setlocale(). - Para o formato brasileiro, formate com
,.2fe troque os caracteres com.translate(str.maketrans(",.", ".,")).