Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro unhashable na linha dict_temp[key_mapping[old_dict]] = value

É como se não encontrasse o dicionário nesta linha. Segue código completo:

import csv import json dados_csv = [] path_csv = 'data_raw/dados_empresaB.csv' with open(path_csv, 'r') as file: spamreader = csv.DictReader(file, delimiter=',') for row in spamreader: dados_csv.append(row) dados_colunas_csv = dados_csv[0].keys()

path_json = 'data_raw/dados_empresaA.json' with open(path_json, 'r') as file: dados_json = json.load(file) nome_colunas_json = list(dados_json[0].keys())

key_mapping = {'Nome do Item': 'Nome do Produto', 'Classificação do Produto': 'Categoria do Produto', 'Valor em Reais (R$)': 'Preço do Produto (R$)', 'Quantidade em Estoque': 'Quantidade em Estoque', 'Nome da Loja': 'Filial', 'Data da Venda': 'Data da Venda'}

new_dados_csv = [] for old_dict in dados_csv: dict_temp = {} for old_key, value in old_dict.items(): dict_temp[key_mapping[old_dict]] = value new_dados_csv.append(dict_temp) print(new_dados_csv[0])

A imagem mostra um terminal com um erro ao executar um script Python chamado "Dados.py". O erro é um "TypeError" com a mensagem "unhashable type: 'dict'", que ocorre na linha 30 do arquivo. Isso indica que um dicionário está sendo usado como chave em outro dicionário, o que não é permitido em Python, pois as chaves precisam ser de um tipo "hashable", como strings ou números.

1 resposta
solução!

Oi Estudante,

O erro TypeError: unhashable type: 'dict' ocorre porque você está tentando usar um dicionário (old_dict) como chave em outro dicionário (key_mapping).

Dicionários em Python precisam de chaves que sejam imutáveis (como strings, números ou tuplas), e um dicionário não é imutável. 🤔

O problema está nesta linha:

dict_temp[key_mapping[old_dict]] = value

Você deve usar a chave antiga (old_key) para buscar o novo nome da coluna no key_mapping.

O código correto seria:

dict_temp[key_mapping[old_key]] = value

Além disso, você está adicionando o dict_temp à lista new_dados_csv dentro do loop for old_key, value in old_dict.items():, o que fará com que você adicione vários dicionários incompletos à lista.

O correto é adicionar o dict_temp depois de percorrer todas as colunas de um registro.

Segue o código corrigido:

import csv
import json

dados_csv = []
path_csv = 'data_raw/dados_empresaB.csv'
with open(path_csv, 'r') as file:
    spamreader = csv.DictReader(file, delimiter=',')
    for row in spamreader:
        dados_csv.append(row)
        dados_colunas_csv = dados_csv[0].keys()

path_json = 'data_raw/dados_empresaA.json'
with open(path_json, 'r') as file:
    dados_json = json.load(file)
nome_colunas_json = list(dados_json[0].keys())

key_mapping = {'Nome do Item': 'Nome do Produto',
               'Classificação do Produto': 'Categoria do Produto',
               'Valor em Reais (R$)': 'Preço do Produto (R$)',
               'Quantidade em Estoque': 'Quantidade em Estoque',
               'Nome da Loja': 'Filial',
               'Data da Venda': 'Data da Venda'}

new_dados_csv = []
for old_dict in dados_csv:
    dict_temp = {}
    for old_key, value in old_dict.items():
        dict_temp[key_mapping[old_key]] = value
    new_dados_csv.append(dict_temp)
    print(new_dados_csv[0])

Para saber mais: Tipos de dados em Python 💪

Continue praticando e explorando o mundo da programação! 💻