Files
ECU-Analyse/Data/vw_engine_data_handler.py

92 lines
4.2 KiB
Python

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.")