17 de novembro de 2009

Como gravar campos de largura fixa

Eu gosto das listas Python Brasil e Django Brasil porque nelas o pessoal sempre ajuda os iniciantes, sem preconceito. Lá, todo mundo se lembra que não nasceu sabendo.

Esses dias surgiu uma dúvida na lista Django Brasil sobre como formatar um arquivo de saída com campos de largura fixa e, dando continuidade ao objetivo desse blog de fornecer dicas para iniciantes em Python, vou transcrever o que rolou.

O Luiz Carlos enviou a seguinte pergunta:
Boa tarde, pessoal.

Estou desenvolvendo um layout de arquivo para um Sistema Legado, o
arquivo deve ter por linha 400 colunas

Que assume diversas posições alguem sabe como fazer isso e os espaços
devem continuar brancos

Consigo gerar o arquivo mas fica tudo uma bagunça...

Precisaria determinar o tamanho e deixar os espaços em branco...

Desde de já agradeço atenção

Luiz Carlos

A resposta do Luciano Ramalho foi uma aula:
Luiz Carlos, o Julio Nobrega recomendou o método ljust, mas eu prefiro
é usar o operador de formatação de strings, que é mais prático e mais
flexível.

Veja na documentação do Python a seção "string formatting operations"

http://docs.python.org/library/stdtypes.html#string-formatting

Basicamente, funciona assim: para cada variável que você quer colocar
na linha, coloca um marcador %s, %d, %f (tem outros, mas estes são os
mais comuns) e depois passa como argumento para o operador uma tupla
de valores que serão encaixados respectivamente nos lugares marcados.
Por exemplo, suponha que você tem itens de um pedido:

>>> fmt = '%3d %-20s %8.2f %8.2f'
>>> fmt % (3, 'micos amestrados', 620, 3*620)
'  3 micos amestrados       620.00  1860.00'
>>> fmt % (18, 'sapos cantores', 17, 18*17)
' 18 sapos cantores          17.00   306.00'



No formato acima, temos:
%3d - exibir número inteiro em base decimal, em campo de 3 espaços de
largura, alinhado à direita
%-20s - exibir string em campo de 20 espaços, alinhada à direita (é o
que faz o sinal - na frente do 20)
%8.2f - exibir número de ponto flutuante em campo de 8 casas de
largura, com duas casas após o ponto decimal, alinhado à direita
[ ]s
Luciano
Fica aí mais uma dica para iniciantes em Python.

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

2 comentários:

  1. Oi. Muito legal o post. Eu sou iniciante em programação e estou querendo aprender Python. Já achei VÁRIAS apostilas, aulas de universidades, livros etc. Porém, tem algumas significativas diferenças entre a interpretação no meu computador para a esperada. Por exemplo, enquanto 7/4 "deveria" dar 1, dá 1.75. Creio que isso é por causa da "versão do meu Python", que é a mais recente, 3.1. Assim, eu não estou achando em lugar algum na internet material atualizado. Você pode me ajudar?

    ResponderExcluir
  2. Felipe, infelizmente você não deixou seu email nem seu perfil tem uma forma de contato.

    Sugiro participar da lista python brasil.

    No meu python 2.6 o resultado é 1 mesmo.

    ResponderExcluir

Marcadores