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

Problemas com a leitura de arquivo csv

Pessoal, tentei rodar o arquivo de leitura, mas aparece esse erro:

Traceback (most recent call last): File "classifica_acessos.py", line 2, in x, y = carregar_acessos() File "/home/angela/Área de Trabalho/cursos-alura/machine-learning/classificacao-web/dados.py", line 13, in carregar_acessos leitor.next() AttributeError: '_csv.reader' object has no attribute 'next'

Tentei modificar algumas coisas e comparei com o que foi feito pelo professor, mas nada...

15 respostas

Bom dia Angela, quando é assim poderia postar o seu código para darmos uma olhada?

Angela, tudo bem? Você verificou se o arquivo tem algum tipo de proteção contra leitura pelo seu sistema operacional?

Jhonatan, não vi, aliás, não sei nem como fazer isso. Simplesmente baixei os arquivos disponibilizados no site da Alura e fiz o exercício...

Bom dia Angela,

Voce pode copiar o codigo que escreveu até agora e enviar em umo novo post aqui? Enquanto isso, aqui está o código final do curso, você pode testar com ele para ver se está fazendo algo de diferente:

https://github.com/alura-cursos/machine-learning-introducao-a-classificacao

att

Guilherme, segue o código:

from dados import carregar_acessos
X,Y = carregar_acessos()

treino_dados = X[:90]
treino_marcacoes = Y[:90]

teste_dados = X[-9:]
teste_marcacoes = Y[-9:]

from sklearn.naive_bayes import MultinomialNB
modelo = MultinomialNB()
modelo.fit(treino_dados, treino_marcacoes)

resultado = modelo.predict(teste_dados)

diferencas = resultado - teste_marcacoes

acertos = [d for d in diferencas if d == 0]
total_de_acertos = len(acertos)
total_de_elementos = len(teste_dados)

taxa_de_acerto = 100.0 * total_de_acertos / total_de_elementos

print(taxa_de_acerto)
print(total_de_elementos)

Testei com o algoritmo passado, com o meu e ainda sim o erro persiste...

Bom dia Angela,

Pode compartilhar o dados.py? A mensagem de erro indica que seja algo na linha 13 deste arquivo.

Um chute por cima que é um problema comum é que o diretório contem um diretório com acento e/ou espaço. Em geral programas são feitos para funcionar com isso mas as vezes alguma ferramenta que estamos usando não suporta isso (muito mais comum em windows do que em outros sistemas operacionais). Não acho que seja o seu caso (que parece ser um linux). Pode enviar o arquivo e conferimos com esse aqui?

https://github.com/alura-cursos/machine-learning-introducao-a-classificacao/blob/master/dados.py

Pode também dar um

ls -la

No diretório onde estão seus arquivos para analisarmos as permissões de acesso deles?

att

Código dado.py:

def carregar_acessos():
    X = []
    Y = []

    arquivo = open('acesso.csv', 'rb')
    leitor = csv.reader(arquivo)

    leitor.next()

    for acessou_home,acessou_como_funciona,acessou_contato, comprou in leitor:

        X.append([int(acessou_home),int(acessou_como_funciona)
            ,int(acessou_contato)])
        Y.append(int(comprou))

    return X, Y

Permissões:

total 24
drwxrwxr-x 3 angela angela 4096 Mai  6 11:44 .
drwxrwxr-x 5 angela angela 4096 Mai  5 08:24 ..
-rw-rw-r-- 1 angela angela  826 Mai 12  2016 acesso.csv
-rw-rw-r-- 1 angela angela  582 Mai  6 11:48 classificacao.py
-rw-rw-r-- 1 angela angela  368 Mai  6 11:47 dados.py
drwxrwxr-x 2 angela angela 4096 Mai  6 11:44 __pycache__

Oi, Angela, tive o mesmo problema que você e pesquisando achei que o correto seria usar:

leitor = csv.reader(arquivo)
next(leitor)

Acredito que seja alguma diferença de versão do Python, como sou novo em Python não tenho certeza.

Valeu!

Oi, Rodolfo! Modifiquei e o erro persiste...

raceback (most recent call last): File "classifica_acessos.py", line 2, in x,y = carregar_acessos() File "/home/angela/Área de Trabalho/cursos-alura/machine-learning/classificacao-web/dados.py", line 13, in carregar_acessos leitor.next(leitor) AttributeError: '_csv.reader' object has no attribute 'next'

Bom dia Angela, como o Rodolfo notou, no python 2.6+ e 3 o "next()" foi renomeado para "next()". Ao invés dele, pode-se usar a função next() pura. Pode testar com o __next__() (são dois underlines antes e depois) para conferir se funciona?

A outra opção é usar a função built in next como o Rodolfo sugeriu. O erro ficou estranho pois ele continua dizendo que o next foi chamado no reader, mas deveria ser o built in. Poderia colar o código atualizado? Outra sugestão pequena para conferir, dê um enter e deixe uma linha nova vazia para ter certeza que o python está pegando sua última versão do arquivo (pois como está sempre na mesma linha e a mesma mensagem de erro pode ser que ele não pegou o atualizado).

Pode também conferir a versão do python que está usando pf?

Segue a versão:

eb$ python
Python 3.6.0 |Anaconda custom (64-bit)| (default, Dec 23 2016, 12:22:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.

Mudei o next e o erro é outro agora /0\

File "classifica_acessos.py", line 17
    acertos = [d for d in diferencas d==0]
                                     ^
SyntaxError: invalid syntax

Perfeito! Então era isso mesmo, a versão mais recente do python pede o uso do next(). Atualizei o texto do capítulo para refletir essa alteração.

Analisando a mensagem de erro ele indica um problema de sintaxe na linha 17. Dá uma conferida no código, vai perceber que faltou um condicional (if) nele. Pequeno detalhe. Em geral erros de sintaxe são detalhes pequenos como esse, e o nosso olho vicia rápido. Nesses casos para detectar o erro o que eu costumo fazer no dia a dia é fechar o arquivo, pra "desviciar" o olho. Ai abro novamente, vou até onde está o problema e confiro se era o que eu queria, palavra por palavra. Em geral no palavra por palavra pego o erro.

Guilherme, não sei mais qual o problema...

Hoje abri de novo o arquivo e o erro persistiu... inseri o if e já havia feito aquela alteração no next... Mudei de novo e nada....

Traceback (most recent call last): File "classificaacessos.py", line 2, in x,y = carregar_acessos() File "/home/angela/Área de Trabalho/cursos-alura/machine-learning/classificacao-web/dados.py", line 13, in carregar_acessos _next() NameError: name 'next' is not defined

solução!

CONSEGUIII!!!! Então, depois de mudar dez mil vezes (rsrs) consegui.

Pesquisei e os erros eram duas coisas (além daquele if que esqueci): next e o parâmetro 'rb':

arquivo = open('acesso.csv', 'r') leitor = csv.reader(arquivo) next(leitor)

:) :)

Acredito que o problema está em ler o arquivo como binário. Não vejo nenum utilidade disse nesse exemplo.