Introdução
Esta seção é um ligeiro desvio, mas quando você trabalha com dados, frequentemente deseja produzir uma saída estruturada (tabelas, etc.). Por exemplo:
Name Shares Price
---------- ---------- -----------
AA 100 32.20
IBM 50 91.10
CAT 150 83.44
MSFT 200 51.23
GE 95 40.37
MSFT 50 65.10
IBM 100 70.44
Formatação de Strings
Uma maneira de formatar strings no Python 3.6+ é com f-strings.
>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{name:>10s} {shares:>10d} {price:>10.2f}'
' IBM 100 91.10'
>>>
A parte {expressão:formato} é substituída.
É comumente usado com print.
print(f'{name:>10s} {shares:>10d} {price:>10.2f}')
Códigos de Formato
Códigos de formato (após o : dentro de {}) são semelhantes ao printf() em C. Códigos comuns incluem:
d Decimal integer
b Binary integer
x Hexadecimal integer
f Float as [-]m.dddddd
e Float as [-]m.dddddde+-xx
g Float, but selective use of E notation
s String
c Character (from integer)
Modificadores comuns ajustam a largura do campo e a precisão decimal. Esta é uma lista parcial:
:>10d Integer right aligned in 10-character field
:<10d Integer left aligned in 10-character field
:^10d Integer centered in 10-character field
:0.2f Float with 2 digit precision
Formatação de Dicionários
Você pode usar o método format_map() para aplicar formatação de strings a um dicionário de valores:
>>> s = {
'name': 'IBM',
'shares': 100,
'price': 91.1
}
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format_map(s)
' IBM 100 91.10'
>>>
Ele usa os mesmos códigos que f-strings, mas pega os valores do dicionário fornecido.
Método format()
Existe um método format() que pode aplicar formatação a argumentos ou argumentos de palavra-chave (keyword arguments).
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format(name='IBM', shares=100, price=91.1)
' IBM 100 91.10'
>>> '{:>10s} {:10d} {:10.2f}'.format('IBM', 100, 91.1)
' IBM 100 91.10'
>>>
Francamente, format() é um pouco verboso. Eu prefiro f-strings.
Formatação no Estilo C
Você também pode usar o operador de formatação %.
>>> 'The value is %d' % 3
'The value is 3'
>>> '%5d %-5d %10d' % (3,4,5)
' 3 4 5'
>>> '%0.2f' % (3.1415926,)
'3.14'
Isso requer um único item ou uma tupla à direita. Os códigos de formatação também são modelados após o printf() em C.
Nota: Esta é a única formatação disponível em strings de bytes.
>>> b'%s has %d messages' % (b'Dave', 37)
b'Dave has 37 messages'
>>> b'%b has %d messages' % (b'Dave', 37) ## %b may be used instead of %s
b'Dave has 37 messages'
>>>
Exercício 2.8: Como formatar números
Um problema comum ao imprimir números é especificar o número de casas decimais. Uma maneira de corrigir isso é usar f-strings. Experimente estes exemplos:
>>> value = 42863.1
>>> print(value)
42863.1
>>> print(f'{value:0.4f}')
42863.1000
>>> print(f'{value:>16.2f}')
42863.10
>>> print(f'{value:<16.2f}')
42863.10
>>> print(f'{value:*>16,.2f}')
*******42,863.10
>>>
A documentação completa sobre os códigos de formatação usados em f-strings pode ser encontrada aqui. A formatação também é, por vezes, realizada usando o operador % de strings.
>>> print('%0.4f' % value)
42863.1000
>>> print('%16.2f' % value)
42863.10
>>>
A documentação sobre vários códigos usados com % pode ser encontrada aqui.
Embora seja comumente usado com print, a formatação de strings não está ligada à impressão. Se você quiser salvar uma string formatada, basta atribuí-la a uma variável.
>>> f = '%0.4f' % value
>>> f
'42863.1000'
>>>
Exercício 2.9: Coletando Dados
No Exercício 2.7, você escreveu um programa chamado report.py que calculava o ganho/perda de uma carteira de ações. Neste exercício, você começará a modificá-lo para produzir uma tabela como esta:
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84
Neste relatório, "Price" (Preço) é o preço atual da ação e "Change" (Mudança) é a mudança no preço da ação em relação ao preço de compra inicial.
Para gerar o relatório acima, você primeiro precisará coletar todos os dados mostrados na tabela. Escreva uma função make_report() que recebe uma lista de ações e um dicionário de preços como entrada e retorna uma lista de tuplas contendo as linhas da tabela acima.
Adicione esta função ao seu arquivo report.py. Veja como ela deve funcionar se você tentar interativamente:
>>> portfolio = read_portfolio('/home/labex/project/portfolio.csv')
>>> prices = read_prices('/home/labex/project/prices.csv')
>>> report = make_report(portfolio, prices)
>>> for r in report:
print(r)
('AA', 100, 9.22, -22.980000000000004)
('IBM', 50, 106.28, 15.180000000000007)
('CAT', 150, 35.46, -47.98)
('MSFT', 200, 20.89, -30.339999999999996)
('GE', 95, 13.48, -26.889999999999997)
...
>>>
Exercício 2.10: Imprimindo uma tabela formatada
Refaça o loop for no Exercício 2.9, mas altere a instrução print para formatar as tuplas.
>>> for r in report:
print('%10s %10d %10.2f %10.2f' % r)
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
...
>>>
Você também pode expandir os valores e usar f-strings. Por exemplo:
>>> for name, shares, price, change in report:
print(f'{name:>10s} {shares:>10d} {price:>10.2f} {change:>10.2f}')
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
...
>>>
Pegue as instruções acima e adicione-as ao seu programa report.py. Faça com que seu programa pegue a saída da função make_report() e imprima uma tabela bem formatada, conforme mostrado.
Exercício 2.11: Adicionando alguns cabeçalhos
Suponha que você tenha uma tupla de nomes de cabeçalho como esta:
headers = ('Name', 'Shares', 'Price', 'Change')
Adicione código ao seu programa que pegue a tupla de cabeçalhos acima e crie uma string onde cada nome de cabeçalho seja alinhado à direita em um campo de 10 caracteres de largura e cada campo seja separado por um único espaço.
' Name Shares Price Change'
Escreva código que pegue os cabeçalhos e crie a string separadora entre os cabeçalhos e os dados a seguir. Esta string é apenas um monte de caracteres "-" sob cada nome de campo. Por exemplo:
'---------- ---------- ---------- -----------'
Quando terminar, seu programa deverá produzir a tabela mostrada no início deste exercício.
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84
Exercício 2.12: Desafio de Formatação
Como você modificaria seu código para que o preço inclua o símbolo de moeda ($) e a saída se pareça com isto:
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 $9.22 -22.98
IBM 50 $106.28 15.18
CAT 150 $35.46 -47.98
MSFT 200 $20.89 -30.34
GE 95 $13.48 -26.89
MSFT 50 $20.89 -44.21
IBM 100 $106.28 35.84
Resumo
Parabéns! Você concluiu o laboratório de Formatação. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.