92 lines
4.2 KiB
Python
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.")
|