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

[Bug] TypeError: 'function' object is not subscriptable

Esse é o meu código:

import json
import csv

def leitura_json(path_json):
    dados_json = [] 
    with open(path_json, 'r') as file: 
        dados_json = json.load(file)
    return dados_json

def leitura_csv(path_csv):
    dados_csv = []
    with open(path_csv, 'r') as file:
        spamreader = csv.reader(file, delimiter=',')
        for row in spamreader:
            dados_csv.append(row)
    return leitura_csv

def leitura_dados(path, tipo_arquivo):
    if tipo_arquivo == 'csv':
        return leitura_csv(path)
    elif tipo_arquivo == 'json':
        return leitura_json(path)
    

def get_columns(dados): 
    return list(dados[0].keys())

def rename_columns(dados, key_mapping):
    new_dados_csv = []
    
    for old_dict in dados:
        dict_temp = {}
        for old_key, value in old_dict.items():
            dict_temp[key_mapping[old_key]] = value
    new_dados_csv.append(dict_temp)
            
    return new_dados_csv

path_json = 'data_raw/dados_empresaA.json'
path_csv = 'data_raw/dados_empresaB.csv'

# Iniciando a leitura
dados_json = leitura_dados(path_json, 'json')
nome_colunas_json = get_columns(dados_json)
print(nome_colunas_json)

dados_csv = leitura_dados(path_csv, 'csv')
nome_colunas_csv = get_columns(dados_csv)
print(nome_colunas_csv)

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'}



# Transformação dos dados

dados_csv = rename_columns(dados_csv, key_mapping)
nome_colunas_csv = get_columns(dados_csv)
print(nome_colunas_csv)
    

E está aparecendo esse erro:

  File "/root/Documentos/pipeline_dados/scripts/fusao_mercado_fev.py", line 48, in <module>
    nome_colunas_csv = get_columns(dados_csv)
  File "/root/Documentos/pipeline_dados/scripts/fusao_mercado_fev.py", line 26, in get_columns
    return list(dados[0].keys())
TypeError: 'function' object is not subscriptable

Já tentei de tudo, conferi o código várias vezes, o que pode estar acontecendo?

2 respostas
solução!

Olá Sthefanie, tudo bem com você?

Isso está acontecendo porque, no final da função leitura_csv, você tem return leitura_csv em vez de return dados_csv. Isso faz com que, quando você chama leitura_dados(path_csv, 'csv'), ele retorne a função leitura_csv que é a própria função, ao invés dos dados lidos do CSV. Além disso, é preciso usar a função DictReader na leitura dos dados CSV e você usou apenas a reader - a diferença principal nesse caso é que enquanto a primeira retorna o formato em dicionário, a outra retorna em lista de listas.

Deixo abaixo o código da função leitura_csv corrigido:


def leitura_csv(path_csv):
    dados_csv = []
    with open(path_csv, 'r', encoding='utf-8') as file:
        spamreader = csv.DictReader(file, delimiter=',')
        for row in spamreader:
            dados_csv.append(row)
    return dados_csv

Após a modificação, salve o código e tente executar novamente.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Muito obrigada, agora deu certo!