Formatação de Strings em Python

Da documentação do Python 3

As operações de formatação descritas aqui (operador %) exibem uma variedade de peculiaridades que levam a um número de erros comuns [...]. Usar os mais novos literais de string formatados [...] ajuda a evitar esses erros. Essas alternativas também fornecem abordagens mais poderosas, flexíveis e extensíveis para formatar texto.

operador %

Prefira Literais de String

Para código novo, o uso de str.format, ou literais de string formatados (Python 3.6+) em vez do operador % é fortemente recomendado.

# operador %: formatação de string estilo antigo (não recomendado para código novo)
name = 'Pete'
'Hello %s' % name  # %s = placeholder de string
"Hello Pete"

Podemos usar o especificador de formato %d para converter um valor int em uma string:

num = 5
'I have %d apples' % num
"I have 5 apples"

str.format

O Python 3 introduziu uma nova maneira de fazer formatação de strings que foi posteriormente retroportada para o Python 2.7. Isso torna a sintaxe para formatação de strings mais regular.

# método str.format(): formatação de string moderna (Python 2.7+)
name = 'John'
age = 20

"Hello I'm {}, my age is {}".format(name, age)  # {} = placeholder
"Hello I'm John, my age is 20"
"Hello I'm {0}, my age is {1}".format(name, age)
"Hello I'm John, my age is 20"

Literais de String Formatados ou f-Strings

Se você estiver usando Python 3.6+, as f-Strings de string são a maneira recomendada de formatar strings.

Da documentação do Python 3

Um literal de string formatado ou f-string é um literal de string que é prefixado com f ou F. Essas strings podem conter campos de substituição, que são expressões delimitadas por chaves {}. Embora outros literais de string sempre tenham um valor constante, as strings formatadas são realmente expressões avaliadas em tempo de execução.

# f-string: maneira recomendada de formatar strings (Python 3.6+)
name = 'Elizabeth'
f'Hello {name}!'  # prefixo f permite expressões em {}
'Hello Elizabeth!'
Quiz

Faça login para responder este quiz e acompanhar seu progresso de aprendizagem

Qual prefixo é usado para f-strings em Python?
A. fmt
B. f ou F
C. format
D. str

É até possível fazer aritmética em linha com isso:

# f-strings suportam expressões: podem incluir cálculos dentro de {}
a = 5
b = 10
f'Five plus ten is {a + b} and not {2 * (a + b)}.'  # Avalia expressões
'Five plus ten is 15 and not 30.'

f-Strings de Múltiplas Linhas

name = 'Robert'
messages = 12
(
f'Hi, {name}. '
f'You have {messages} unread messages'
)
'Hi, Robert. You have 12 unread messages'

O especificador =

Isso imprimirá a expressão e seu valor:

# especificador =: imprime o nome da variável e o valor (Python 3.8+)
from datetime import datetime
now = datetime.now().strftime("%b/%d/%Y - %H:%M:%S")
f'date and time: {now=}'  # Imprime "now='Nov/14/2022 - 20:50:01'"
"date and time: now='Nov/14/2022 - 20:50:01'"

Adicionando espaços ou caracteres

name = 'Robert'
f"{name.upper() = :-^20}"
'name.upper() = -------ROBERT-------'
f"{name.upper() = :^20}"
'name.upper() =        ROBERT       '
f"{name.upper() = :20}"
'name.upper() = ROBERT              '

Formatação de Dígitos

Adicionando separador de milhares

a = 10000000
f"{a:,}"
'10,000,000'

Arredondamento

a = 3.1415926
f"{a:.2f}"
'3.14'
Quiz

Faça login para responder este quiz e acompanhar seu progresso de aprendizagem

O que f"{a:.2f}" faz?
A. Arredonda o número para o inteiro mais próximo
B. Formata como uma porcentagem
C. Formata o número como um float com 2 casas decimais
D. Converte para notação científica

Exibindo como Porcentagem

a = 0.816562
f"{a:.2%}"
'81.66%'

Tabela de formatação de números

NúmeroFormatoSaídaDescrição
3.1415926{:.2f}3.14Formata float com 2 casas decimais
3.1415926{:+.2f}+3.14Formata float com 2 casas decimais e sinal
-1{:+.2f}-1.00Formata float com 2 casas decimais e sinal
2.71828{:.0f}3Formata float sem casas decimais
4{:0>2d}04Preenche o número com zeros (preenchimento à esquerda, largura 2)
4{:x<4d}4xxxPreenche o número com x’s (preenchimento à direita, largura 4)
10{:x<4d}10xxPreenche o número com x’s (preenchimento à direita, largura 4)
1000000{:,}1,000,000Formato de número com separador de vírgula
0.35{:.2%}35.00%Formata porcentagem
1000000000{:.2e}1.00e+09Notação de expoente
11{:11d}11Alinhado à direita (padrão, largura 10)
11{:<11d}11Alinhado à esquerda (largura 10)
11{:^11d}11Alinhado ao centro (largura 10)

Template Strings

Um mecanismo mais simples e menos poderoso, mas é recomendado ao lidar com strings geradas por usuários. Devido à sua menor complexidade, as template strings são uma escolha mais segura.

from string import Template
name = 'Elizabeth'
t = Template('Hey $name!')
t.substitute(name=name)
'Hey Elizabeth!'