Dúvida UTF-8 em CSV

365 views
Skip to first unread message

Ricardo Mazzolli

unread,
May 29, 2013, 5:42:20 PM5/29/13
to Grupo Python-Brasil
Ol�, pessoal.

Estou com uma d�vida que j� me rendeu v�rias horas perdidas.

Tenho que gravar, entre outras coisas, a express�o "Cruzeiros Mar�timos"
em um arquivo CSV.

S� que, usando a biblioteca 'csv', o que vai para o arquivo � "Cruzeiros
Marítimos".

Como eu fa�o para setar o suporte para que os caracteres especiais
apare�am corretamente no arquivo?

N�o sei se ajuda mas estou mandando o c�digo que abre o arquivo:


caminho = '/home/mazzolli/CM/'
arq = "exemplo.csv"
arquivo = open(caminho + arq, 'w')
arqCsv = csv.writer(arquivo, delimiter=chr(165), quoting=csv.QUOTE_NONE)
print "Exportando entrevista " + arq


Att.
Ricardo L. Mazzolli

--
Se voc� julgar um peixe por sua capacidade de subir em uma �rvore, ele vai gastar toda a sua vida acreditando ser est�pido.

Robson Roberto Souza Peixoto

unread,
May 29, 2013, 8:08:27 PM5/29/13
to python...@googlegroups.com
Testei esse código [1] e funcionou.



2013/5/29 Ricardo Mazzolli <ric...@gmail.com>
Olá, pessoal.

Estou com uma dúvida que já me rendeu várias horas perdidas.

Tenho que gravar, entre outras coisas, a expressão "Cruzeiros Marítimos" em um arquivo CSV.

Só que, usando a biblioteca 'csv', o que vai para o arquivo é "Cruzeiros Marítimos".

Como eu faço para setar o suporte para que os caracteres especiais apareçam corretamente no arquivo?

Não sei se ajuda mas estou mandando o código que abre o arquivo:



caminho = '/home/mazzolli/CM/'
arq = "exemplo.csv"
arquivo = open(caminho + arq, 'w')
arqCsv = csv.writer(arquivo, delimiter=chr(165), quoting=csv.QUOTE_NONE)
print "Exportando entrevista " + arq


Att.
Ricardo L. Mazzolli

--
Se você julgar um peixe por sua capacidade de subir em uma árvore, ele vai gastar toda a sua vida acreditando ser estúpido.

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
   http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
   python-brasil+unsubscribe@googlegroups.com

--- Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.





--
Robson Roberto Souza Peixoto
Robinho http://robsonpeixoto.com/
Master in Computer Science, University of Campinas
Linux Counter #395633
IRC: robsonpeixoto
Twitter: http://twitter.com/rrspba
github: https://github.com/robsonpeixoto

Linux Polegato

unread,
May 29, 2013, 8:27:12 PM5/29/13
to python...@googlegroups.com
Olá!

Você não colocou de onde está lendo os dados e nem como está escrevendo no arquivo csv.

Possivelmente você está lendo em uma codificação diferente de UTF-8 e não esta convertendo em UTF-8 e já gravando no arquivo csv, e creio que esteja misturando outras informações em UTF-8 e o editor em que está abrindo o csv está detectando como UTF-8.

Qual a codificação dos dados que está lendo? Qual editor está usando para visualizar o csv? Já tentou mudar a codificação no editor para ver se os caracteres ficam corretos em outra codificação?

[]'s
            Junior Polegato




 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.

Ricardo Lima Mazzolli

unread,
May 30, 2013, 10:30:53 PM5/30/13
to Grupo Python-Brasil
Olá, Junior Polegato.

O que eu pretendo é gravar a expressão "Cruzeiros Marítimos" no CSV com codificação UTF-8. Essa expressão está gravada em uma variável; coloquei no meu próprio código:

nomeEntrevista = 'Cruzeiros Marítimos'
dadosCsv = [[]]
dadosCsv[0].append(nomeEntrevista)
arqCsv.writerows(dadosCsv)

No que diz respeito à codificação do código em si, foi setado na primeira linha (#coding: utf-8). E o próprio arquivo .py foi gravado em UTF-8. Foi isso que você perguntou? Estou usando o Pluma, um editor de textos que vem com o Linux Mint, muito parecido com o Gedit do Ubuntu...

Robson: Eu estou me baseando no código que está naquela página mas não encontro instruções para resolver esse problema em específico. Cheguei a testar algumas coisas mas ficava dando erros do tipo " 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128) ".....

Aliás, o motivo de eu procurar ajuda no grupo é esse...


--
"No xadrez, chama-se 'enrascada' quando o movimento mais correto é não se mexer." (Sr. Ninguém)

Nando Florestan

unread,
May 31, 2013, 9:04:45 AM5/31/13
to python...@googlegroups.com
Primeiro, para esclarecer certos conceitos, é fundamental ler este post:
http://www.joelonsoftware.com/articles/Unicode.html

Agora voltando ao Python, o diabo é que em Python 2 existem 2 tipos de string: bytestring e unicode.

Como você está gravando o seu código em utf-8 e declarando isso no topo, uma coisa que te falta é que suas strings sejam instâncias de unicode.

A melhor forma de fazer isso é botar como primeiro import:

from __future__ import unicode_literals

(Isto não é necessário no Python 3.x porque finalmente o tipo padrão de string se tornou unicode.)

Com esse import, as suas literais de string são convertidas em objetos unicode, não bytestring.

Agora vamos ao segundo problema: o módulo csv da stdlib em Python 2 não suporta escrever unicode. Esse suporte só existe a partir de Python 3. Para resolver isso, é necessário codificar cada string a ser escrita no csv manualmente:

nomeEntrevista = 'Cruzeiros Marítimos'.encode('utf-8')  # returns a bytestring

Com isso o código deve funfar.

Para fazer essa codificação de forma transparente você pode usar um módulo da minha biblioteca "bag":
https://github.com/nandoflorestan/bag/blob/master/bag/csv2.py

Abs
Nando Florestan

Pedro Werneck

unread,
May 31, 2013, 9:22:52 AM5/31/13
to python...@googlegroups.com
Use a tablib, do Kenneth Reitz. Além de ter suporte a unicode, é muito mais simples de usar do que a lib csv da stdlib.



2013/5/31 Nando Florestan <nandofl...@gmail.com>

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
---
Pedro Werneck

Linux - Junior Polegato

unread,
May 31, 2013, 9:27:36 AM5/31/13
to python...@googlegroups.com
Em 30-05-2013 23:30, Ricardo Lima Mazzolli escreveu:
> Ol�, Junior Polegato.
> O que eu pretendo � gravar a express�o "Cruzeiros Mar�timos" no CSV
> com codifica��o UTF-8. Essa express�o est� gravada em uma vari�vel;
> coloquei no meu pr�prio c�digo:
> nomeEntrevista = 'Cruzeiros Mar�timos'
> dadosCsv = [[]]
> dadosCsv[0].append(nomeEntrevista)
> arqCsv.writerows(dadosCsv)
> No que diz respeito � codifica��o do c�digo em si, foi setado na
> primeira linha (#coding: utf-8). E o pr�prio arquivo .py foi gravado
> em UTF-8. Foi isso que voc� perguntou? Estou usando o Pluma, um editor
> de textos que vem com o Linux Mint, muito parecido com o Gedit do
> Ubuntu...
> Robson: Eu estou me baseando no c�digo que est� naquela p�gina mas n�o
> encontro instru��es para resolver esse problema em espec�fico. Cheguei
> a testar algumas coisas mas ficava dando erros do tipo " 'ascii' codec
> can't encode character u'\xa1' in position 0: ordinal not in
> range(128) ".....
> Ali�s, o motivo de eu procurar ajuda no grupo � esse...

Ol�!

Executei seus passos aqui e o arquivo foi gravado normalmente,
veja:

#!/usr/bin/env python
#coding: utf-8
import csv
caminho = '/tmp/'
arq = "exemplo.csv"
arquivo = open(caminho + arq, 'w')
arqCsv = csv.writer(arquivo, delimiter=chr(165), quoting=csv.QUOTE_NONE)
print "Exportando entrevista " + arq
nomeEntrevista = 'Cruzeiros Mar�timos'
dadosCsv = [[]]
dadosCsv[0].append(nomeEntrevista)
arqCsv.writerows(dadosCsv)

$ file /tmp/exemplo.csv
/tmp/exemplo.csv: UTF-8 Unicode text, with CRLF line terminators

Tente executar num terminal "file <caminho>/exemplo.csv" para
ver se realmente � UTF-8. Se for e o Pluma estiver abrindo com
caracteres esquisitos, ent�o o problema � do Pluma que n�o est�
reconhecendo que o arquivo � UTF-8. Se estiver em outra codifica��o,
ent�o o problema est� na codifica��o do arquivo .py, a� executando file
sobre ele deveria ter:

$ file /tmp/teste.py
/tmp/teste.py: Python script, UTF-8 Unicode text executable

Se n�o estiver em UTF-8, ent�o mais uma vez � "problema" do
editor, que n�o est� salvando em UTF-8, a� tem que procurar como fazer o
editor salvar em UTF-8.

Tente refazer em outro editor, como o gedit ou geany, e veja o
resultado.

[]'s
Junior Polegato

Flávio Casacurta

unread,
May 31, 2013, 5:31:07 PM5/31/13
to python...@googlegroups.com
Tente 

dadosCsv[0].append(nomeEntrevista.decode('cp1252').encode('utf8')

Flávio

Em quarta-feira, 29 de maio de 2013 18h42min20s UTC-3, Hohenheim escreveu:
Ol�, pessoal.

Estou com uma d�vida que j� me rendeu v�rias horas perdidas.

Tenho que gravar, entre outras coisas, a express�o "Cruzeiros Mar�timos"
em um arquivo CSV.

S� que, usando a biblioteca 'csv', o que vai para o arquivo � "Cruzeiros
Marítimos".

Como eu fa�o para setar o suporte para que os caracteres especiais
apare�am corretamente no arquivo?

N�o sei se ajuda mas estou mandando o c�digo que abre o arquivo:


caminho = '/home/mazzolli/CM/'
arq = "exemplo.csv"
arquivo = open(caminho + arq, 'w')
arqCsv = csv.writer(arquivo, delimiter=chr(165), quoting=csv.QUOTE_NONE)
print "Exportando entrevista " + arq


Att.
Ricardo L. Mazzolli

--
Se voc� julgar um peixe por sua capacidade de subir em uma �rvore, ele vai gastar toda a sua vida acreditando ser est�pido.

Ricardo Mazzolli

unread,
Jun 5, 2013, 1:07:34 PM6/5/13
to python...@googlegroups.com
Ol�, pessoal!

S� pra dar uma resposta. Obrigado a todos pela ajuda!
Eu consegui adaptando as dicas de voc�s e cheguei � linha que resolve o
meu problema:

nomeEntrevista = 'Cruzeiros Mar�timos'.encode('iso-8859-1')

O sistema est� rodando perfeitamente e funcionando. :D

Muito obrigado mesmo!

Abra��o!
Ricardo L. Mazzolli

--
Se voc� julgar um peixe por sua capacidade de subir em uma �rvore, ele vai gastar toda a sua vida acreditando ser est�pido.

Reply all
Reply to author
Forward
0 new messages