import csv import os # O ficheiro VW_Engines.txt deve estar na mesma pasta que este script. DATA_FILE_PATH = os.path.join(os.path.dirname(__file__), 'VW_Engines.txt') def load_vw_engine_data(): """ Carrega os dados dos motores Volkswagen a partir do ficheiro VW_Engines.txt. Retorna: list: Uma lista de dicionários, onde cada dicionário representa um motor e contém as suas especificações. Retorna uma lista vazia se o ficheiro não for encontrado ou ocorrer um erro. """ engines = [] if not os.path.exists(DATA_FILE_PATH): print(f"Erro: Ficheiro de dados não encontrado em {DATA_FILE_PATH}") # Poderia levantar uma exceção aqui ou retornar uma lista vazia # dependendo de como a aplicação principal deve lidar com isso. return engines try: with open(DATA_FILE_PATH, mode='r', encoding='utf-8') as file: # Tente utf-8 primeiro # Usar csv.reader com delimitador de tabulação reader = csv.reader(file, delimiter='\t') try: header = next(reader) # Obter a linha de cabeçalho except StopIteration: print(f"Erro: Ficheiro de dados {DATA_FILE_PATH} está vazio ou não contém cabeçalho.") return engines # Limpar nomes de cabeçalho (remover possíveis BOM ou espaços extra) header = [h.strip() for h in header] for row_number, row in enumerate(reader, 1): # Começa a contagem de linhas de dados em 1 if not row or len(row) != len(header): # Pular linhas vazias ou malformadas # print(f"Aviso: Linha {row_number+1} ignorada devido a formato incorreto (esperados {len(header)} campos, obteve {len(row)}): {row}") continue engine_data = {} for i, column_name in enumerate(header): value = row[i].strip() # Tentar converter campos numéricos if column_name in ['Size', 'kW', 'HP', 'From', 'To']: try: engine_data[column_name] = int(value) except ValueError: engine_data[column_name] = value # Manter como string se a conversão falhar else: engine_data[column_name] = value engines.append(engine_data) except UnicodeDecodeError: # Se utf-8 falhar, tentar com 'latin-1' que é comum em alguns ambientes Windows try: engines = [] # Resetar a lista de motores with open(DATA_FILE_PATH, mode='r', encoding='latin-1') as file: reader = csv.reader(file, delimiter='\t') header = [h.strip() for h in next(reader)] for row in reader: if not row or len(row) != len(header): continue engine_data = {} for i, column_name in enumerate(header): value = row[i].strip() if column_name in ['Size', 'kW', 'HP', 'From', 'To']: try: engine_data[column_name] = int(value) except ValueError: engine_data[column_name] = value else: engine_data[column_name] = value engines.append(engine_data) except Exception as e_latin1: print(f"Erro ao ler ou processar o ficheiro de dados com latin-1: {e_latin1}") return [] # Retornar lista vazia em caso de erro except Exception as e_utf8: print(f"Erro ao ler ou processar o ficheiro de dados com utf-8: {e_utf8}") return [] # Retornar lista vazia em caso de erro return engines if __name__ == '__main__': # Exemplo de utilização: vw_data = load_vw_engine_data() if vw_data: print(f"Carregados {len(vw_data)} registos de motores.") # Imprimir os primeiros 5 registos como exemplo for i, engine in enumerate(vw_data[:5]): print(f"Registo {i+1}: {engine}") else: print("Nenhum dado de motor carregado.")