Skip to content

Glossário virtual em Python e Glade – parte II

16/11/2009

Na primeira parte deste tutorial você viu como montar o ambiente de desenvolvimento necessário para criar o glossário, e definimos um dialeto CSV para ser usado ao ler e gravar os arquivos com os termos do glossário. Nessa parte, você verá como fazer o programa ler e gravar esses arquivos CSV.

Antes de escrever o código, é necessário conhecer as funções reader e writer do módulo CSV. Como o próprio nome diz, reader serve para ler o CSV. Ela recebe um dialeto e um objeto iterável contendo strings (como uma lista ou um arquivo) e retorna outro objeto iterável, dessa vez com os campos do CSV já separados de acordo com o dialeto. Exemplo:

reader = csv.reader(arquivo, dialect="excel")

No nosso caso, usar uma lista com os campos (termo e significado) não faz muito sentido, pois um dicionário com os termos como chaves, e os significados como seus valores, cumpriria bem melhor o papel. Assim, na hora de pesquisar um significado, basta chamar:

dicionario[termo]

E na hora de gravar ou criar um novo termo, basta chamar:

dicionario[termo] = significado

Mais na frente faremos algumas modificações no dicionário do Python (a tipo dict) para adaptá-lo melhor às necessidades de um glossário, mas por enquanto só precisamos de uma função que receba o caminho do arquivo CSV e retorne um dicionário comum. Veja o código da função.

Repare que quando há uma exceção IOError ao abrir o arquivo, caso ele exista, é lançada uma exceção do tipo ArquivosError, que nada mais é do que uma classe de exceção vazia. Classe de exceção é uma classe que herda da classe base para todas as exceções no Python, a Exception. Pra que criar uma classe de exceção vazia? Para organizar nosso programa e dar um tratamento especial a esses erros na interface gráfica. Veja o código da classe  ArquivosError.

O próximo passo é criar a função que vai gravar os novos termos e as alterações que foram feitas no glossário do arquivo a partir do qual ele foi carregado. Para isso, utilizaremos a função writer que, assim como reader, recebe um arquivo e um dialeto retornando um objeto com os métodos write e writerows. Write escreve um registro por vez, e writerows recebe um iterável e escreve cada registro dentro dele no arquivo. Exemplo:

registro = ('C', 'Linguagem de programação.')
f = file('arquivo.csv', 'w')

writer = csv.writer(f, dialect='excel')
writer.write(registro)

registros = {'Flash':'Uma tecnologia para estragar sites.', 'Assembler':'Não é o nome de uma linguagem'}
writer.writerows(registros.items())

O que precisamos no nosso módulo de arquivos, é uma função que receba um dicionário com os dados a serem gravados no arquivo, e receba um caminho de arquivo para gravar esses dados. Lembra quando eu disse que vamos criar um dicionário personalizado? Um dos recursos do nosso dicionário é que ele armazenará no atributo path uma string com o caminho do arquivo de onde ele foi lido, assim a nossa função de gravar só precisa receber o glossário, ou seja, o nosso dicionário especial. Veja o código da função.

Note que nas duas funções eu usei o módulo codecs para abrir os arquivos, e usei a “constante” CODIFICACAO para informar a função open(), a codificação do arquivo. O módulo codecs é uma mão na roda na hora de mexer com arquivos de texto, porque ele evita diversos problemas de codificação. Ao ler um arquivo, ele usa a codificação informada para converter o conteúdo em Unicode (uma espécie de codificação universal), e ao gravar ele transforma as strings Unicode de volta em strings codificadas, de forma transparente. Eu � Unicode.😉

Você pode atribuir a CODIFICACAO o charset que quiser (eu gosto de usar sempre utf-8). Basta que ao salvar o CSV em outros programas (como editores de planilha), você tenha o cuidado de usar sempre a mesma codificação para evitar que o texto apareça todo zoado no glossário.

Com essa parte do tutorial finalizamos o nosso módulo de ler arquivos. Veja aqui o código completo, comentado e documentado do módulo. Na próxima parte do tutorial, faremos o nosso “model” e mostrarei como personalizar o dicionário do Python, incluindo o atributo path e otras cositas más.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: