1
resposta

AttributeError: 'Dados' object has no attribute 'leitura_dados'

Olá, fiz o código na aula e, quando fui testar, ele deu o seguinte erro:

Traceback (most recent call last): File "/home/calebe/pipeline_dados/scripts/fusao_mercado_fev.py", line 70, in dados_empresaA = Dados(path_json, 'json') File "/home/calebe/pipeline_dados/scripts/processamento_dados.py", line 10, in init self.dados = self.leitura_dados() AttributeError: 'Dados' object has no attribute 'leitura_dados'

Eu já verifiquei o código várias vezes mas não achei nada diferente do curso. Segue os códigos:

fusao_mercado_fev.py:

import  json
import csv

from processamento_dados import Dados

    
def size_data(dados):
    return len(dados)
def join(dadosA, dadosB):
    combined_list = []
    combined_list.extend(dadosA)
    combined_list.extend(dadosB)
    return combined_list
def transforma_dados_tabela(dados, nomes_colunas):

    dados_combinados_tabela = [nomes_colunas]

    for row in dados:
        linha = []
        for coluna in nomes_colunas:
            linha.append(row.get(coluna, 'Indisponível'))
        dados_combinados_tabela.append(linha)

    return dados_combinados_tabela
def salva_dados(dados, path):
    with open(path, 'w') as file:
        writer = csv.writer(file)
        writer.writerows(dados)

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

#Extract

dados_empresaA = Dados(path_json, 'json')
print(f'''Nome das colunas da empresa A: {dados_empresaA.nomes_colunas}
            Tamanho dos dados da empresa A: {dados_empresaA.qtd_linhas}''')

dados_empresaB = Dados(path_csv, 'csv')
print(f'''Nome das colunas da empresa B: {dados_empresaB.nome_colunas}
            Tamanho dos dados da empresa B: {dados_empresaB.qtd_linhas}''')


#Transform

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

dados_empresaB.rename_columns(key_mapping)
print(f'Renomeando os nomes das colunas: {dados_empresaB.nomes_colunas}')

(Retirei os comentários para ocupar menos linhas aqui no fórum)

processamento_dados.py:

import csv
import json


class Dados:

    def __init__(self, path, tipo_dados):
        self.path = path
        self.tipo_dados = tipo_dados
        self.dados = self.leitura_dados()
        self.nomes_colunas = self.get_columns()
        self.qtd_linhas = self.size_data()

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

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

            return dados_csv
        
        def leitura_dados(self):
            dados = []

            if self.tipo_dados == 'csv':
                dados = self.leitura_csv()

            elif self.tipo_dados == 'json':
                dados = self.leitura_json()

            return dados
        
        def get_columns(self):
            return list(self.dados[-1].keys())
        
        def rename_columns(self, key_mapping):
            new_dados = []

            for old_dict in self.dados:
                dict_temp = {}
                for old_key, value in old_dict.items():
                    dict_temp[key_mapping[old_key]] = value
                new_dados.append(dict_temp)
            
            self.dados = new_dados
            self.nomes_colunas = self.get_columns()

        def size_data(self):
            return len(self.dados)

Agradeço se puder identificar o(s) erro(s) me responder o mais rápido possível!

1 resposta

Olá, Calebe! Como vai?

O problema está na definição dos métodos dentro da sua classe Dados.

Basicamente foi um erro de indentação.

Os métodos estão definidos dentro do método __init__, quando deveriam estar no mesmo nível dele, ou seja, dentro da classe Dados, mas não dentro de outro método.

Seria assim:

class Dados:

    def __init__(self, path, tipo_dados):
        self.path = path
        self.tipo_dados = tipo_dados
        self.dados = self.leitura_dados()
        self.nomes_colunas = self.get_columns()
        self.qtd_linhas = self.size_data()

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

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

        return dados_csv
        
    def leitura_dados(self):
        dados = []

        if self.tipo_dados == 'csv':
            dados = self.leitura_csv()

        elif self.tipo_dados == 'json':
            dados = self.leitura_json()

        return dados
        
    def get_columns(self):
        return list(self.dados[-1].keys())
        
    def rename_columns(self, key_mapping):
        new_dados = []

        for old_dict in self.dados:
            dict_temp = {}
            for old_key, value in old_dict.items():
                dict_temp[key_mapping[old_key]] = value
            new_dados.append(dict_temp)
        
        self.dados = new_dados
        self.nomes_colunas = self.get_columns()

    def size_data(self):
        return len(self.dados)

Agora os outros métodos estão nos mesmos níveis! :)

Se outra dúvida surgir, estamos aqui.

Abraços!

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