Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Não consigo identificar o que está errado no meu código

#-*- coding: UTF-8 -*-
from __future__ import unicode_literals

class Perfil(object):
    def __init__(self, nome, telefone, empresa):
        self.nome = nome
        self.telefone = telefone
        self.empresa = empresa
        self.__curtidas = 0

    def curtir(self):
        self.__curtidas += 1

    def get_curtidas(self):
        return self.__curtidas

    def imprimir(self):
        print '%s' % (self.nome)
        print '%s' % (self.telefone)
        print '%s' % (self.empresa)
        print '%s' % (self.__curtidas)

    @classmethod
    def gera_perfis(classe, nome_arquivo):
        perfis = []
        arquivo = open(nome_arquivo,'r')
        for linha in arquivo:
            valores = linha.split(',')
            perfis.append(classe(*valores))

        arquivo.close()
        return perfis


class Perfil_vip(Perfil):
    def __init__(self, nome, telefone, empresa, apelido=''):
        super(Perfil_vip, self).__init__(nome, telefone, empresa)
        self.apelido = apelido

    def ganha_credito(self):
        return super(Perfil_vip, self).get_curtidas()*10

O console está apontando este erro, não sei o que ele está indicando e nem como resolver, preciso de ajuda:

File "", line 1, in File "models.py", line 28, in gera_perfis valores = linha.split(',') UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 13: ordinal not in range(128)

7 respostas

Oi Gabriel, acho que vc vai precisar dar uma fuçada nesse seu arquivo.. tem algum caractere inválido nele, considerando o uft-8. Como erro de encoding é muito comum, eu fui dar uma pesquisada... uma galera já recebeu esse mesmo erro => http://stackoverflow.com/questions/9644099/python-ascii-codec-cant-decode-byte

Talvez vc precise fazer o decode da string para depois encodar de novo.

Oi Alberto, obrigado pelas dicas, você poderia me enviar como meu código deveria ficar para resolver o problema? Vou dar uma olhada no arquivo com o nome, número e emprego, mas eu baixei o fornecido pelo curso, não sei o que pode estar errado nele

Parece que o problema é no arquivo que vc está tentando ler, posta ele ai para facilitar a ajuda.

Ana Paula Gonçalves, 21-34345432, Amigas Ltda
Camila Almeida, 21-21215643, Auron Ltda 
Alexandrina Pessoa, 11-23416531, Primo Serviços
João da Silva, 45-21249834, Preço Ótimo

OBS: ele está salvo como perfis.txt e só mais um questão eu não deveria ter declarado "linha = arquivo.readline()"?, já testei isso e não resolveu o problema, mas fiquei na dúvida

Faça o seguinte teste, tire os caracteres especicias, deixe seu arquivo assim:

Ana Paula Goncalves, 21-34345432, Amigas Ltda
Camila Almeida, 21-21215643, Auron Ltda 
Alexandrina Pessoa, 11-23416531, Primo Servicos
Joao da Silva, 45-21249834, Preco Otimo

Qualquer coisa podemos ver via skype se desejar tmb.

Eu fiz o uso do código que está disponibilizado para download e deu tudo certo,fui fazer com o meu código deu o mesmo erro

solução!

Veja o meu ai:

# -*- coding: utf-8 -*-

class Perfil():
    'Classe Padrão para perfis de usuários'

    def __init__(self, nome, telefone, empresa):
        if(len(nome) < 3):
            raise Argumento_Invalido_Error('Nome deve ter pelo menos 3 caracteres')
        self.nome = nome
        self.telefone = telefone
        self.empresa = empresa
        self.__curtidas = 0


    def imprimir(self):
        print 'Nome: %s, Telefone %s, empresa %s ,você tem %s curtida(s).' %(self.nome, self.telefone, self.empresa, self.__curtidas)

    def curtir(self):
        self.__curtidas += 1

    def obter_curtidas(self):
        return self.__curtidas

    @classmethod
    def gerar_perfis(classe, nome_arquivo):
        arquivo = open(nome_arquivo, 'r')
        perfis = []
        for linhas in arquivo:
            valores = linhas.split(',')
            if(len(valores) is not 3):
                raise ValueError('Uma linha do arquivo %s deve ter 3 valores' %nome_arquivo)
            perfis.append(classe(*valores))
        arquivo.close()
        return perfis


class Perfil_vip(Perfil):
    'Classe Padrão para perfis de usuários vips'

    def __init__(self, nome, telefone, empresa, apelido=''):
        super(Perfil_vip, self).__init__(nome, telefone, empresa)
        self.apelido = apelido

    def obter_creditos(self):
        if self.__tipo ==1:
            return super(Perfil_vip, self).obter_curtidas() * 10.0


class Argumento_Invalido_Error(Exception):
    def __init__(self, mensagem):
        self.mensagem = mensagem

    def __str__(self):
        return repr(self.mensagem)

#Daqui para baixo não faz parte do principal
class Data():
    'classe formatacao de data'

    def __init__(self, dia, mes, ano):
        self.dia = dia
        self.mes = mes
        self.ano = ano

    def imprime(self):
        print '%s/%s/%s' %(self.dia, self.mes, self.ano)

a inserindo e listando

 from models import Perfil
perfis = Perfil.gerar_perfis('perfis.csv')
 for p in perfis:
    p.imprimir()

arquivo nomes.csv

rafael, 1111111, asasdasd
maria, 1111111,asasdasd
gabriel, 1111111, asasdasd
antonio,1123,asadasdasd

Testa ai novamente, qualquer coisa vai linha por linha e da uma conferida