Uma aula de Python com os filiados dos partidos políticos.

September 6, 2014

O Tribunal Superior Eleitoral (TSE) disponibiliza a lista de filiados dos partidos políticos, todo conteúdo esta disponível de graça (para detalhes veja o Provimento-CGE nº 7/2013). Sem dúvidas um passo importante no processo de transparência das eleições, contudo acessar a informação de fato pode ter algumas dificuldades que podem ser contornadas com alguns conhecimentos programação. Vamos aprender como fazer isso!

Ferramentas

Para executar os exemplos precisaremos do Python 3.4.1 (download) instalado no computador e se você não sabe nada da linguagem começe seus estudos acessando o portal do Programaê.

Já tenho o Python instalado…

A primeira coisa que precisamos é entrar no site do TSE e escolher o partido E estado em questão. Siga as recomendações do site: http://www.tse.jus.br/partidos/filiacao-partidaria/relacao-de-filiados

Já tenho o arquivo zip salvo…

Vamos tomar como exemplo a lista de filiados do PMDB em Rondônia, o arquivo salvo será: filiados_pmdb_ro.zip

Ao descompactar o arquivo você terá a seguinte estrutura de pastas:

O arquivo leiame.pdf descreve a formatação e ordem do conteúdo dos arquivos csv (dê uma lida rápida neste arquivo).

Os arquivos csv contêm a informação que procuramos:

  • fil_sub_jud_pmdb_ro.csv tem a lista de candidatos com a filiação sob apreciação judicial, sem sentença final.
  • filiados_pmdb_ro.csv tem a lista de TODOS os filiados no partido no estado.

Os arquivos csv contêm dados separados por um delimitador, o mais comum é a vírgula, contudo isto não é regra e outros caracteres podem ser utilizados como é o caso do nosso exemplo que é delimitado com o ponto-e-vírgula. Para abrir um arquivo csv o melhor é utilizar um programa de planilhas, como o Excel, LibreOffice, GoogleSheets, etc; pois eles “filtram” o delimitador e organizam dos dados nas linhas e colunas da tabela, contudo se tiver curiosidade abra com um editor de textos comum para ver o conteúdo na sua forma original (raw).

De posse de toda esta informação vamos responder a duas perguntas importantes:

  1. Que tipo de informação eu gostaria de extrair? (1)
  2. Como fazer isso? (2)

(1) Para o exemplo eu quero buscar o nome (ou trecho) do filiado ao partido e retornar todas a informações pertinentes. (2) Irei fazer isso utilizando a linguagem Python para abrir o arquivo, buscar o nome e apresentar o resultado na tela.

Ao executar:

Espero receber uma lista de pessoas com “SILVA” no nome bem como as informações a respeito, um exemplo:

Vamos codificar!

No restante deste texto você irá ver uma solução para o problema mas lembre-se: há inúmeras maneiras de fazer um programa e obter o mesmo resultado esperado, se você fez algo diferente e deseja compartilhar deixe uma mensagem nos comentários no final.

a partir do arquivo leiame.pdf (ctrl+c/ctrl+v na descrição)

seções = [“Data da extração das informações do banco de dados”, “Hora da extraçãoo das informações do banco de dados”, “Numero da inscrição eleitoral”, “Nome do filiado”, “Sigla do partido político”, “Nome do partido político”, “Unidade da federação”, “Código do município”, “Nome do municí­pio”, “Zona eleitoral”, “Seção eleitoral”, “Data da filiação”, “Situação do registro de filiação”, “Tipo do registro de filiação”, “Data do processamento do registro de filiação”, “Data da desfiliação”, “Data do cancelamento do registro de filiação”, “Data da regularização do registro de filiação”, “Motivo do cancelamento do registro de filiação”]

Também não podemos nos esquecer dos parâmetros passados como argumentos para o programa, afinal de contas queremos que nosso programa funcione com diversas entradas do usuário. Para isso vamos utilizar o módulo sys do Python e armazenar em uma variável os parâmetros correspondentes.

import sys arquivo = sys.argv[1] nome = sys.argv[2]

A imagem abaixo irá ajudar a entender os índices:

Agora que preparamos a estrutura de funcionamento do programa e sabemos como armazenar os parâmtros vamos percorrer cada linha do nosso arquivo csv, para isso utilizaremos dois recursos da linguagem: estruturas de repetição e funções de manipulação de arquivos.

import sys

arquivo = sys.argv[1] with open(arquivo, encoding=’ISO-8859-1’) as f: reader = csv.reader(f) for linha in reader: print(linha)

Em linha gerais, podemos ler o trecho acima como:

“Com o arquivo csv respectivo, passado como parâmetro, vamos abri-lo, chamá-lo de f e a partir disso aplicar uma função de leitura csv.readerpara ir iterando for e ter acesso ao conteúdo de cada linha do arquivo”.

Não se preocupe se não entendeu tudo, vamos complementar alguns detalhes no final, como o uso do parâmetro encoding='ISO-8859-1'. A melhor maneira de entender a execução do trecho acima é experimentando, rode e veja o resultado.

Começar simples, observar e manipular

Note que a versão final deste programa não saiu de primeira, começamos com algo bem simples, como percorrer as linhas de um arquivo. Entendemos como a informação nos é apresentada e a partir disso manipulamos de acordo.

No nosso exemplo o que temos até agora? Uma série de listas com um item apenas. Se observamos o conteúdo deste item temos um texto longo… justamente com a informação que precisamos. Agora vamos ver o que precisamos fazer para manipular os dados:

  • Fatiar o item em uma lista na qual cada item é determinado pelo delimitador split(';')
  • Nesta lista pegar o nome do filiado nome_csv = valores_csv[3]
  • Percorrer cada linha do arquivo csv. for linha in reader:
  • Comparar este nome com o nome passado como parâmetro nome_csv.find(nome)
  • Listar for e apresentar o resultado print

Traduzinho para a sintaxe do Python:

with open(sys.argv[1], encoding=’ISO-8859-1’) as f: reader = csv.reader(f) for linha in reader: valores_csv = linha[0].split(‘;’) nome_csv = valores_csv[3] if nome_csv.find(nome) != -1: print(“—-“) for info in zip(seções,valores_csv): print(‘* ‘ + info[0] + ‘: ‘ + info[1])

Leia devagar, experimente fazer pequenas modificações e veja o que acontece.

Referências para aprofundar seu entendimento.

  • Faça os exercícios com Listas do Codecademy.
  • Faça os exercícios com with e as do Codecademy.
  • A função find() retorna o índice (posição) da primeira ocorrência, caso nao ache nada retorna -1. Teste no console.

“http://www.programae.org.br”.find(‘.’) # acha a primeira ocorrência do ponto (.) 10 “http://www.programae.org.br”.find(‘x’) # busca por ‘x’ … mas não acha nada -1

  • A função zip() faz uma transposição dos elementos de duas, ou mais, listas, mesclando os seus valores. Se as listas forem de diferentes tamanhos ele irá mesclar pela menor quantidade de itens. Veja um exemplo de execução, passo a passo.

Melhorando a estética

Vamos falar das cores, no terminal do Linux podemos fazer isso de forma simples, apenas compondo as strings com um código de definição de cor. Se você estiver usando o Windows ou outro sistema, por favor, faça uma pesquisa e ensine nos comentários.

YELLOW = ‘\033[93m’ RED = ‘\033[91m’ BLUE = ‘\033[94m’ END = ‘\033[0m’

print(YELLOW + “texto amarelho” + END) print(RED + “texto vermelho” + END) print(BLUE + “texto azul” + END)

A variável END é necessária para voltar com a cor inicial.

Finale!

Com tudo acertado, podemos reescrever o trecho anterior com as cores agora:

with open(sys.argv[1], encoding=’ISO-8859-1’) as f: reader = csv.reader(f) for linha in reader: valores_csv = linha[0].split(‘;’) nome_csv = valores_csv[3] if nome_csv.find(nome) != -1: print(RED + “—-“ + END) for info in zip(seções,valores_csv): print(‘* ‘ + BLUE + info[0] + END + ‘: ‘ + YELLOW + info[1] + END)

Faça DOWNLOAD do código-fonte e não deixe de testar!

Ah! Já ia me esquecendo o encoding passado como parâmetro dentro da função open é necessário para nos alinharmos com a codificação do arquivo csv disponibilizado pelo TSE, o tema é extenso e merece um post específico.

Finalmente, o código completo:

Futuro

Algumas questões para melhoria do programa:

  • Como tratar erros dos usuários?
  • Como testar melhor nosso código?
  • A documentação poderia ser melhorada para facilitar o entendimento?

Let’s code!

O mesmo conceito apresentado neste texto pode ser aplicado com outras bases, em tempo, deixo alguns links para inspiração:

  • Alguns dados dos governo Brasileiro em dados.gov.br.
  • Diversas informações, sobre mobilidade urbana, no município de São Paulo, tudo disponibilizado pela SPTrans.