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.

16 de novembro de 2009

Várias atribuições na mesma linha

Há alguns dias eu enviei uma pergunta para a lista Python Brasil perguntando sobre estilo de inicialização de variáveis e recebi uma ótima dica.

Em Python é possível atribuir conteúdo às variáveis de dois modos:
a = b = ""

ou
a = ""
b = ""

A primeira forma é um atalho, né? Mais prática e sucinta, mas esconde uma pegadinha.
Se eu usar esse atalho com dicionários ou listas, por exemplo, veja o que pode acontecer:
a = b = []
a.append("a")
print a
print b

Estranho, né?
Tente fazer o mesmo com um dicionário e você terá o mesmo resultado.

Agora tente assim:

a = []
b = []
a.append("a")
print a
print b

Pronto. Acho que era isso que a gente queria, certo?

Aproveite e dê uma lida no post Pegadinha: parâmetro default que fala de um assunto parecido.

20 de outubro de 2009

Atribuir conteúdo default a uma variável

Normalmente, quando queremos checar se uma determinada variável está vazia para atribuir um conteúdo default a ela, fazemos assim:


if not minha_var:
minha_var = 'default'

Existe um atalhozinho legal para isso:

minha_var = minha_var or 'default'

Aqui entra em ação os operadores lógicos do python, nesse caso, o or.

Para saber mais sobre esse assunto e também como funciona o and e o not, estude a seção Boolean Operators do manual do Python.