Pessoal,
Estou tendo que usar o python 2.7 por causa do Arcgis 10.1 que não suporta python 3.
Ao trabalhar com listas no python 2.7 não estou conseguindo acertar a codificação dentro delas. Vejam o exemplo a seguir:
# -*- coding: utf-8 -*-
list = []
list.append("abacate")
list.append("mamão")
list.append("maçã")
for x in list:
print(x)
Quanto imprimo cada elemento da lista o resultado sai normal:
abacate
mamão
maçã
No entanto, se imprimo a list em sí:
# -*- coding: utf-8 -*-
list = []
list.append("abacate")
list.append("mamão")
list.append("maçã")
print(list)
Os caracteres acentuados e cedilha ficam com erro de codificação dentro da lista:
['abacate', 'mam\xc3\xa3o', 'ma\xc3\xa7\xc3\xa3']
Já pesquisei de tudo e não encontrei ninguém com o mesmo problema, acho que deve ser algum detalhe simples que estou errando.
Alguém poderia me ajudar?
--
--
------------------------------------
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ê recebeu essa mensagem porque está inscrito no grupo quot;Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.
-- Ademir Francisco da Silva Skype ...: Ademir_Francisco_da_Silva
>>> print repr("mamão")
'mam\xc3\xa3o'
Como o Alex mostrou, você pode usar o método de string join.
Obrigado demais a toda a galera do post,
Eu estava me batendo demais com isso. A questão é que eu estava tentando conectar uma PythonAddin do tipo Combobox do ArcGis 10.1 em uma lista de dados que estou extraindo de um banco Postgresql, através de um script em python 2.7. Daí eu conectei com o banco de dados, fiz a consulta e puchei a lista, daí na hora de puxar a lista na combobox os itens acentuados estavam vindo com erro de codificação. Eu estava achando que era uma questão de configuração do python 2.7. Com a explicação de vocês eu mexi no código conseguí resolver, agradeço imensamente a todos vocês, e segue o codigo final caso seja útil para alguém:
Foi fundamental a inclusão da linha 14 para a solução, não sei exatamente porque mais parece que quando os dados estavam saindo do objeto "cursor" provindo do banco de dados eles estavam perdendo o codificação correta, quando criei outra lista chamada "ListaFazendas" e recodifiquei para UTF-8 cada ítem de "cursor" tudo ficou certinho.
1 # coding: UTF-8
2
3 try:
4 db = psycopg2.connect(host='srvfsa18', user='postgres', password='domeliseu',dbname='postgres')
5 except:
6 pythonaddins.MessageBox("Falha na conexão com o banco de dados", 'INFO', 0)
7 quit()
8
9 cursor = db.cursor()
10 cursor.execute("SELECT fazenda FROM fazendas;")
11 ListaFazendas = []
12 for x in cursor:
13 ListaCadaFazenda = list(x)
14 y = str(ListaCadaFazenda[0]).decode('UTF-8')
15 ListaFazendas.append(y)
16 self.items = ListaFazendas
O join numa lista ja pega o __str__
# coding=utf-8from __future__ import unicode_literals # Primeira tentativa, não funciona!
# list_repr file
list_fruits = ["abacate", "mamão", "maçã"]
print(list_fruits)
# Segunda tentativa usando 'formatação manual' * funciona mas dá muito trabalho ! *
print("[{!s}]".format(', '.join([u'%s' % i for i in list_fruits])))
# Terceira tentativa (orientação a objetos).
class List(list):
def __str__(self): string = [] for s in self: if not isinstance(s, basestring): s = str(s) string.append(s if isinstance(s, unicode) else unicode(s, 'utf-8')) string = u"[{!s}]".format(u', '.join(string)) # only unicode string return string.encode('utf-8') # bytes strings
list_fruits = List(("maçã", "abacate", "mamão"))print('r: ', repr(list_fruits))
# Afetando o sistema embutido!
import __builtin____builtin__.list = List
list_fruits = list(("abacate", "mamão", "maçã"))print(list_fruits)
# test_builtins file
# coding=utf-8# import list_repr## list_fruits = list(("abacate", "mamão", "maçã", 100, 200, list))# print('r: ', repr(list_fruits))## print('builtins changed')# print(list_fruits)--
Pessoal,
Como vocês estavam explicando em python 2.7 os conteúdos das listas são armazenados em ASCII, que não tem suporte para caracteres acentuados, cedilha, etc.
Neste sentido me surgiu outra questão: Como ordenas as palavras dentro das listas?Tenho a seguinte lista:
Lista = [“Califórnia”, “Paraíso”, “Água Nascente”, “Água Lima”, “Arizona”]Ao ordenar - Lista.sort() – o resultado fica:
Lista = [“Arizona”, “Califórnia”, “Paraíso”, “Água Lima”, “Água Nascente”]Quando o correto seria:
Lista = [“Água Lima”, “Água Nascente”, “Arizona”, “Califórnia”, “Paraíso”]Existe alguma maneira de resolver este problema?