associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Csv2Ldif

Receita: csv2ldif

Ao mudar meu cliente de e-mail de Outlook Express para Thunderbird, encontrei uma dificuldade para passar meu address book de um para outro. O Thunderbird estava lendo o arquivo CSV (exportado do OE) e as informações ficavam todas bagunçadas. A solução que encontrei foi fazer um pequeno script que faz a conversão do formato CSV para LDIF, que pelo que vi, é o padrão do Thunderbird.

O que o script faz é simplesmente ler linha por linha o arquivo CSV e guardar estas informações em um arquivo LDIF.

O script usa Tkinter (não seria necessário, mas fiz apenas para deixar uma interface gráfica com o usuário. Note que no formato CSV deve ser seguida determinada ordem, ou então será necessário mexer no script. Outro item importante é cuidar para que nos campos de endereço, por exemplo, não tenha <ENTER> pressionado, separando uma linha e outra (endereço e cidade ou bairro, por exemplo), pois isso pode "quebrar" uma linha no arquivo e certamente ocorrerá um erro no tratamento...

Quem quiser melhorar, pode postar novos códigos ou alterações abaixo, certamente serão bem-vindos! ;-)

Código

   1 #!/usr/bin/env python
   2 
   3 #-----------------------------------------------------------------------------
   4 # Name:        csv2ldif.py
   5 # Purpose:     gerar um arquivo com formato LDIF (address book do Thunderbird) a partir de um arquivo CSV (formato alternativo de exportação do Outlook Express)
   6 #
   7 # Author:      Fabiano Charlier Ahlert
   8 #
   9 # Created:     2006/06/12
  10 # RCS-ID:      $Id: module1.py $
  11 # Copyright:   (c) 2006
  12 # Licence:     GPL
  13 # New field:   Ver observações abaixo
  14 #-----------------------------------------------------------------------------
  15 # Desenvolvido por Fabiano Charlier Ahlert
  16 # Instruções
  17 # Copie este arquivo para a mesma pasta do arquivo CSV a ser convertido
  18 # e execute-o
  19 # Este programa realiza a conversão de arquivos CSV (gerados pelo Outlook
  20 # a partir do bloco de endereços) para arquiso LDIF (arquivo para importação
  21 # para o bloco de endereços do Mozilla
  22 # as colunas do arquivo CSV devem estar na seguinte ordem:
  23 # Nome;Sobrenome;Segundo nome;Nome;End. de email;Telefone residencial;Fax residencial;Telefone celular;Rua do endereço comercial;Cidade do endereço comercial;CEP do endereço comercial;Estado do endereço comercial;País/região do endereço comercial;Telefone comercial;Fax comercial;Empresa
  24 # se o seu arquivo tiver uma estrutura diferente, faça as devidas alterações.... ;-)
  25 
  26 from Tkinter import *
  27 
  28 def converte(self):
  29     Label(frame1, text="Lendo a linha de número:").grid(row=2, column=1, columnspan=3, sticky=W)
  30     a_csv=arq_csv.get()+".csv"
  31     a_ldif=arq_ldif.get()+".ldif"
  32     arquivo1=open(a_csv, 'r')
  33     a=arquivo1.readline()
  34     a=arquivo1.readline()
  35     arquivo2=open(a_ldif, 'a')
  36     n=1
  37     while a != "":
  38         cont=Label(frame1, text=n, anchor=W)
  39         cont.grid(row=2, column=6)
  40         b=a.split(';')
  41         try:
  42             primeiro_nome=b[0]
  43             segundo_nome=(b[2]+" "+b[1]).rstrip()
  44             segundo_nome=""
  45             nome_completo=b[3]
  46             email=b[4]
  47             fone_res=b[5]
  48             fax_res=b[6]
  49             fone_cel=b[7]
  50             end=b[8]
  51             cid=b[9]
  52             cep=b[10]
  53             est=b[11]
  54             pais=b[12]
  55             fone_com=b[13]
  56             fax_com=b[14]
  57             empresa=b[15]
  58         except:
  59             print "Linha: "+`n`
  60             print a
  61             print b
  62             print "O numero de parametros deve ser 16. O numero de parametros encontrados foi:"
  63             print len(b)
  64             arquivo1.close()
  65             arquivo2.close()
  66             janela.destroy()
  67         arquivo2.write('dn: cn='+nome_completo+',mail='+email+'\n')
  68         arquivo2.write('objectclass: top\n')
  69         arquivo2.write('objectclass: person\n')
  70         arquivo2.write('objectclass: organizationalPerson\n')
  71         arquivo2.write('objectclass: inetOrgPerson\n')
  72         arquivo2.write('objectclass: mozillaAbPersonAlpha\n')
  73         arquivo2.write('givenName: '+primeiro_nome+'\n')
  74         arquivo2.write('sn: '+segundo_nome+'\n')
  75         arquivo2.write('mail: '+email+'\n')
  76         arquivo2.write('modifytimestamp: 0Z\n')
  77         arquivo2.write('telephoneNumber: '+fone_com+'\n')
  78         arquivo2.write('homePhone: '+fone_res+'\n')
  79         arquivo2.write('fax: '+fax_com+'\n')
  80         arquivo2.write('mobile: '+fone_cel+'\n')
  81         arquivo2.write('street: '+end+'\n')
  82         arquivo2.write('l: '+cid+'\n')
  83         arquivo2.write('st: '+est+'\n')
  84         arquivo2.write('postalCode: '+cep+'\n')
  85         arquivo2.write('company: '+empresa+'\n')
  86         a=arquivo1.readline()
  87         n=n+1
  88     arquivo1.close()
  89     arquivo2.close()
  90 
  91 janela=Tk()
  92 janela.title(" Conversão de arquivo")
  93 frame1=Frame(janela)
  94 frame1.grid(columnspan=9)
  95 Label(frame1, text="").grid(row=0, column=0)
  96 Label(frame1, text="").grid(row=1, column=0)
  97 Label(frame1, text="").grid(row=0, column=9)
  98 Label(frame1, text="").grid(row=1, column=9)
  99 Label(frame1, text="").grid(row=2, column=0)
 100 Label(frame1, text="Nome do arquivo CSV a ser convertido (sem extensão):").grid(row=0, column=1, columnspan=3, sticky=W)
 101 Label(frame1, text="Nome do arquivo LDIF a ser gravado    (sem extensão):").grid(row=1, column=1, columnspan=3, sticky=W)
 102 arq_csv=Entry(frame1, width=15, takefocus="")
 103 arq_ldif=Entry(frame1, width=15, takefocus="")
 104 arq_csv.grid(row=0, column=4, columnspan=3, sticky=W)
 105 arq_ldif.grid(row=1, column=4, columnspan=3)
 106 
 107 
 108 inicia=Button(janela, text="INICIAR\nCONVERSÃO", fg="blue")
 109 inicia.bind("<Button-1>", converte)
 110 inicia.bind("<space>", converte)
 111 inicia.grid(row=3, columnspan=9)
 112 
 113 janela.mainloop()

Volta para CookBook.


FabianoAhlert