7
respostas

Está dando erro quando tento executar o principal.py

Quando tento executar o programa acontece o seguinte erro: Traceback (most recent call last): File "C:\Users\ACER\PycharmProjects\Alura\I_O\principal.py", line 18, in contatos = contatos_utils.json_para_contatos('contatos.json') File "C:\Users\ACER\PycharmProjects\Alura\I_O\contatos_utils.py", line 44, in json_para_contatos c = Contato(contato['id'], contato['nome'], email=contato['email']) TypeError: 'NoneType' object is not subscriptable

7 respostas

Olá, mostra seu código por favor

Código do contatos.utils.py

import csv, pickle, json from contato import Contato

def csv_para_contatos(caminho): contatos = []

with open(caminho, encoding='latin_1') as arquivo:
    leitor = csv.reader(arquivo) #csv.reader() faz a quebra automática das virgulas geradas nos arquivos csv. Essa quebra ajuda quando for colocar o contéudo do csv em uma classe

    for linha in leitor:
        id = linha[0]
        nome = linha[1]
        email = linha[2]

        contato = Contato(id, nome, email)
        contatos.append(contato)

return contatos

def contatos_para_pickle(contatos, caminho): with open(caminho, mode='wb') as arquivo: #wb é o modo de escrita e binário pickle.dump(contatos, arquivo)

def pickle_para_contatos(caminho): with open(caminho, mode='rb') as arquivo: contatos = pickle.load(arquivo)

return contatos

def contatos_para_json(contatos, caminho): with open(caminho, mode='w') as arquivo: json.dump(contatos, arquivo, default=contatopara_json)

def contatopara_json(contato): contato.dict

def json_para_contatos(caminho): contatos = []

with open(caminho) as arquivo:
    contatos_json = json.load(arquivo)

for contato in contatos_json:
    c = Contato(**contato)
    contatos.append(c)

return contatos

**# Código do principal.py**

import contatos_utils

try: contatos = contatos_utils.csv_para_contatos('contatos.csv')

# contatos_utils.contatos_para_pickle(contatos, 'contatos.pickle')
# contatos = contatos_utils.pickle_para_contatos('contatos.pickle')

contatos_utils.contatos_para_json(contatos, 'contatos.json')
contatos = contatos_utils.json_para_contatos('contatos.json')

for contato in contatos:
    print(f'{contato.id} - {contato.nome} - {contato.email}')

except FileNotFoundError: print('Arquivo não encontrado') except PermissionError: print('Sem permissão de escrita')

Então, tenho certeza que esse artigo vai te ajudar > link

pelo que entendi meu erro é estar colocando da seguinte maneira: c = Contato(contato['id'], contato['nome'], contato['email']) contatos.append(c)

o erro seria colocar o objeto na variável c e tentar adicionar à lista por meio da dela, e não diretamente pelo objeto

Então, eu tentei colocar assim: contatos.append(Contato(contato['id'], contato['nome'], contato['email'])

Porém, ainda assim, apresenta o mesmo erro e outra coisa, o erro não é na linha do append() e sim na linha em que defini a variavel

Traceback (most recent call last): File "C:\Users\ACER\PycharmProjects\Alura\I_O\principal.py", line 18, in contatos = contatos_utils.json_para_contatos('contatos.json') File "C:\Users\ACER\PycharmProjects\Alura\I_O\contatos_utils.py", line 45, in json_para_contatos c = Contato(contato['id'], contato['nome'], contato['email']) TypeError: 'NoneType' object is not subscriptable

Confere se o teu Json contém todos os valores que você pede, e se os nomes estão corretos.

Em contatopara_json está faltando return.

Acho que o problema está na versão pois tentei algumas coisas e não deu certo. Copiei o código da aula e rodei e deu os mesmos erros. A versão do python da aula é 3.6 e a que eu uso é a 3.9.1