Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

A primeira vez que acessar o developerWorks, um perfil será criado para você. Informações do seu perfil (tais como: nome, país / região, e empresa) estarão disponíveis ao público, que poderá acompanhar qualquer conteúdo que você publicar. Seu perfil no developerWorks pode ser atualizado a qualquer momento.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Manipule dados CSV com o Python e o pureXML

Importe e converta dados de censo dos EUA para XML usando o Python no IBM DB2 Express-C

Joe Lennon, Software developer, Core International
Joe Lennon photo
Joe Lennon, 24 anos, é desenvolvedor de software em Cork, Irlanda. Autor do livro Beginning CouchDB da Apress (ainda não publicado), tem colaborado com o IBM developerWorks com diversos artigos técnicos e tutoriais. Em seu tempo livre, Joe gosta de jogar futebol, mexer em pequenos mecanismos e bater seus recordes em seu Xbox 360.

Resumo:  O IBM® DB2® pureXML® lhe possibilita armazenar dados XML de forma nativa em um sistema de gerenciamento de banco de dados relacional, dando-lhe o poder e a flexibilidade de relatar estes dados sem perder as vantagens que o formato XML oferece. Neste tutorial, você aprenderá como se conectar a um banco de dados DB2 a partir da linguagem de programação Python, importando dados populacionais do United States Census Bureau. O Python será utilizado para converter este arquivo CSV para um arquivo XML, antes de inserir os dados XML de forma nativa no DB2. Finalmente, mostraremos como utilizar o Python para criar um aplicativo de linha de comandos que produza algumas tabelas informativas que podem ser acessadas através do menu do sistema.

Data:  26/Mar/2010
Nível:  Intermediário

Atividade:  21910 visualizações

Baixando e convertendo os dados CSV

Nesta seção do tutorial, mostraremos como criar um script Python para baixar um arquivo CSV do Web site do United States Census Bureau. Então, você processará estes dados CSV e os converterá para XML para que possam ser armazenados no banco de dados DB2 pureXML criado anteriormente neste tutorial.

Antes de iniciar, deve-se criar uma pasta em algum local do disco rígido onde você armazenará os arquivos do projeto. Eu armazenei meus dados na pasta C:\pycensus e sugiro que você faça o mesmo.

Baixando arquivos CSV do Web site do US Census Bureau

O United States Census Bureau possui uma superabundância de dados disponíveis para download, em uma variedade de formatos diferentes. Infelizmente, os dados populacionais do Censo de 2000 e as estimativas para cada ano seguinte só estão disponíveis no formato CSV e não em XML. Entretanto, isso não é um problema, já que você pode usar o Python para baixar esse arquivo CSV do Web site do Census Bureau e convertê-lo para XML que pode ser armazenado no banco de dados DB2 pureXML.

Se desejado, pode-se apontar seu navegador da Web para o URL para a pasta do projeto do arquivo CSV. Entretanto, ao invés disso, você criará um script Python que executará essa tarefa. Utilizando seu editor de texto preferido, crie um novo arquivo e salve-o como download.py na sua pasta do projeto (C:\pycensus, por exemplo). Adicione o código da Listagem 3 a esse arquivo.


Listagem 3. download.py
import httplib
conn = httplib.HTTPConnection("www.census.gov")
conn.request("GET", "/popest/national/files/NST-EST2008-alldata.csv")
response = conn.getresponse()
f = open('data.csv', 'w')
f.write(response.read())
f.close()
conn.close()

Neste script, você utiliza o módulo httplib para se conectar ao Web site census.gov e emitir um pedido GET para o arquivo CSV necessário. Então, pegue a resposta e grave em um arquivo nomeado data.csv. Para executar este script, abra o Prompt de Comandos do Windows e altere o diretório do projeto para: cd \pycensus.

Então, execute o seguinte comando para executar o script Python: python download.py.

Quando o script estiver concluído você retornará ao prompt. Você pode se perguntar o porquê da ausência de mensagens—não se preocupe, é um bom sinal de que não ocorreu nenhum erro. Abra a pasta do projeto no Windows Explorer e observe que agora há um arquivo extra na pasta chamado data.csv. O Microsoft Excel® será o programa padrão para abrir este tipo de arquivo, caso você o tenha instalado. Ao abri-lo, você terá um resultado como o mostrado na Figura 5.


Figura 5. data.csv no Microsoft Excel
Screen capture of data.csv in Microsoft Excel

AVISO: NÃO salve este arquivo no Excel, pois ele pode modificar o formato do arquivo CSV da maneira que melhor se adeque ao programa, fazendo com que ele não seja legível pelo Python. Se o Excel lhe perguntar se quer salvar o arquivo, escolha Não. Caso salve este arquivo por acidente, simplesmente exclua-o e execute o script Python download.py novamente. Nesta seção, mostraremos como converter este arquivo CSV para um arquivo XML.


Convertendo dados CSV para documentos XML

Para converter dados CSV para XML, deve-se ter certeza de como se quer armazenar os dados: se registros distintos devem ser armazenados de maneira diferente e verificar se alguns registros devem ser descartados. No exemplo do arquivo CSV que você acabou de baixar, você notará que ele contém três tipos de dados: uma linha única de informações do país inteiro; quatro linhas para dados das regiões nordeste, meio oeste, sul e oeste; cinquenta e uma linhas para dados dos cinquenta estados dos EUA e o Distrito de Columbia; e uma linha para o Estado Livre Associado de Porto Rico. A primeira linha do arquivo é a linha de cabeçalho que será usada para os nomes das colunas.

O script criado nesta seção tomara como base a linha de cabeçalho e usará estes dados para formar os nomes de identificação de cada elemento que um registro deve possuir no documento XML. O script determinará, com base nas primeiras quatro colunas, se a linha em particular se refere a um país, região ou estado e designará um nome de identificação adequado para indicar a que o documento XML se refere. Finalmente, o script optará por excluir o Estado Livre Associado de Porto Rico por conter alguns dados incompletos.

Crie, em seu editor de texto, um novo arquivo e salve-o como convert.py. Adicione a esse arquivo o código da Listagem 4.


Listagem 4. convert.py
import csv

reader = csv.reader(open('data.csv'), delimiter=',', quoting=csv.QUOTE_NONE)

print "<data>"
for record in reader:
    if reader.line_num == 1:
        header = record
    else:
        innerXml = ""
        dontShow = False
        type = ""
        for i, field in enumerate(record):
            innerXml += "<%s>" % header[i].lower() + field + "</%s>" 
% header[i].lower()
            if i == 1 and field == "0":
                type = "country"
            elif type == "" and i == 3 and field == "0":
                type = "region"
            elif type == "" and i == 3 and field != "0":
                type = "state"

            if i == 1 and field == "X":
                dontShow = True

        if dontShow == False:
            xml = "<%s>" % type
            xml += innerXml
            xml += "</%s>" % type
            print xml
print "</data>"

Neste arquivo, a biblioteca csv será usada para ler o arquivo data.csv. Envolva os resultados com uma tag XML de abertura <data> e um de fechamento </data> já que um arquivo único de saída está sendo produzido. Então faça um loop em cada linha do arquivo CSV. Se a linha atual for a primeira linha do arquivo, coloque esse registro como cabeçalho. Ele será utilizado mais tarde no script como um nome de elemento para cada campo nos registros de país, região ou estado. Se a linha atual não for o registro de cabeçalho, faça um loop em cada coluna no registro e crie uma sequência interna de elementos XML cujo nome é acionado pelo registro de cabeçalho. Verifique então se a linha em questão está se referendo ao país, região ou estado e envolva o elemento XML interno em uma tag externa<country>, <region>, ou <state> adequada. Finalmente, verifique se o registro contém um X em um campo específico. Caso possua, defina um indicador de variáveis booleanas para True que interromperá a adição desta linha em particular ao documento XML. A maneira de executar esse script é a mesma de antes, emitindo: python convert.py.

Executando o script dessa maneira você gerará um resultado como o mostrado na Figura 6.


Figura 6. resultados convert.py
Screen capture of convert.py output, showing data information as concatenated XML document

Como se pode observar, o script colocou os dados diretamente na tela. Seria muito mais útil se esses dados fossem salvos em um arquivo. Ao invés de criar mais um código Python para fazer isso, pode-se simplesmente modificar o comando emitido para dizer ao prompt de comando para salvar os resultados em um arquivo com o nome de data.xml: python convert.py > data.xml.

Isso criará um novo arquivo no diretório do projeto com o nome de data.xml. Se este arquivo for aberto em um aplicativo de leitura e formatação XML, como o Firefox, pode-se observar um resultado como mostra a Figura 7.


Figura 7. Resultados XML no Mozilla Firefox
Screen capture of data viewed as XML output in Mozilla Firefox

Com os dados armazenados em um arquivo como este, pode-se importar o XML para o banco de dados DB2 utilizando um arquivo .del e o comando IMPORT. Entretanto, esses resultados desses dados XML são armazenados em uma linha única na tabela DB2. Agora, é possível utilizar o XQuery para dividir esses dados e armazená-los em linhas separadas. Mas como o Python já está sendo usado para criar o documento XML, é muito mais fácil executar uma série de instruções INSERT diretamente no próprio script convert.py. Na próxima seção, mostraremos como fazer isso modificando o script convert.py.

4 de 9 | Anterior | Próximo

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre, Information Management
ArticleID=477983
TutorialTitle=Manipule dados CSV com o Python e o pureXML
publish-date=03262010
author1-email=joe@joelennon.com
author1-email-cc=