aircv不能读取中文路径文件名的解决方法( 错误提示 raise RuntimeError("file: '%s' not exists" % filename))

前序

aircv是codeskyblue 基于python-opencv2在 https://github.com/NetEaseGame/aircv提交的库,是一款基于Python-opencv2的目标定位。codeskyblue于2017年4月24日最后一次更新支持opencv3。我个人很喜欢这个库,可以实现从一张图中找出局部特征图,可以找多图。

用法示例

import aircv as ac
imsrc = ac.imread('youimage.png') # 原始图像
imsch = ac.imread('searched.png') # 带查找的部分

1.SIFT查找图像

print ac.find_sift(imsrc, imsch)
# - when Not found
@return None 
# 之前是返回的 []
# - when found
@return {'point': (203, 245), 'rectangle': [(160, 24), (1
from pysat.sat_test import TestCase, CaseInfo from pysat.sat_result import ResultInfo from pysat import sat_conf from pysat import rpc3 import os # 添加os模块用于文件操作 import logging from PyNetConfig import NetConfig as net from PyPing import my_ping as ping import PyScapy as capture import time logger = logging.getLogger(__name__) _gcfg = sat_conf.TestbedConfig() def get_config(name): '''get the testbed config info, return the value''' return _gcfg.get(name.lower()) class Test(TestCase): def __init__(self): TestCase.__init__(self) self.logger = logging.getLogger(self.__class__.__name__) self.case_info = CaseInfo() self.case_info.name = 'cdent_class_test' self.case_info.id = 'FG999992' self.case_info.version = '202508150002' self.case_info.author = 'suihaoyu@tp-link.com.hk' self.case_info.runtime = '4min' self.case_info.testbeds = self.get_testbed_list() self.case_info.description = ''' ''' def add_task(self): self.register_case(self.FG999992__cdent_class_test, self.case_info) def FG999992__cdent_class_test(self): try: result = ResultInfo() self.logger.info('前置操作:从数据读取预期的参数信息') nic_name = get_config('pc_nic_name') nic_ip = get_config('pc_nic_ip') nic_mask = get_config('pc_nic_mask') nic_gateway = get_config('pc_nic_gateway') nic_dns1 = get_config('pc_nic_dns1') nic_dns2 = get_config('pc_nic_dns2') self.logger.info(f'nic_ip {nic_ip}') # 实例化网卡 pc_nic = net(nic_name) self.logger.step('步骤1: 读取当前pc网卡的IP/MASK/gateway/dns信息') ip_list = pc_nic.get_ip_list() ip = ip_list[0]['ip'] mask = ip_list[0]['mask'] flag = True if ip != nic_ip: flag = False result.add_result(passfail=ResultInfo.FAIL, actual_result=ip, expected_result=nic_ip, test_comment='读取当前pc的网卡IP地址', item_id='步骤1.1') if mask != nic_mask: flag = False result.add_result(passfail=ResultInfo.FAIL, actual_result=mask, expected_result=nic_mask, test_comment='读取当前pc的网卡mask', item_id='步骤1.2') gateway = pc_nic.get_gateway_list()[0] if gateway != nic_gateway: flag = False result.add_result(passfail=ResultInfo.FAIL, actual_result=gateway, expected_result=nic_gateway, test_comment='读取当前pc的网卡gateway', item_id='步骤1.3') dns = pc_nic.get_dns_list() dns1 = dns[0] dns2 = dns[1] if dns1 != nic_dns1: flag = False result.add_result(passfail=ResultInfo.FAIL, actual_result=dns1, expected_result=nic_dns1, test_comment='读取当前pc的网卡dns1', item_id='步骤1.4') if dns2 != nic_dns2: flag = False result.add_result(passfail=ResultInfo.FAIL, actual_result=dns2, expected_result=nic_dns2, test_comment='读取当前pc的网卡dns2', item_id='步骤1.5') if flag: result.add_result(passfail=ResultInfo.PASS, actual_result=f'ip:{ip}, mask:{mask}, gateway:{gateway}, dns1:{dns1}, dns2:{dns2}', expected_result=f'ip:{nic_ip}, mask:{nic_mask}, gateway:{nic_gateway}, dns1:{nic_dns1}, dns2:{nic_dns2}', test_comment='读取当前pc网卡的IP/MASK/gateway/dns信息', item_id='步骤1') self.logger.step('步骤2: 存储网卡信息到文件') # 创建result文件夹(如果不存在) result_dir = "result" if not os.path.exists(result_dir): os.makedirs(result_dir) self.logger.info(f"创建目录: {result_dir}") # 创建带时间戳的文件名 timestamp = time.strftime("%Y%m%d_%H%M%S") filename = f"nic_info_{timestamp}.txt" file_path = os.path.join(result_dir, filename) # 准备要写入的内容 content = f"""网卡信息报告 ============== 测试时间: {time.ctime()} 网卡名称: {nic_name} IP地址: {ip} 子网掩码: {mask} 默认网关: {gateway} DNS服务器1: {dns1} DNS服务器2: {dns2} 测试状态: {'通过' if flag else '失败'}""" # 写入文件 with open(file_path, 'w', encoding='utf-8') as f: f.write(content) self.logger.info(f"网卡信息已保存到: {file_path}") # 将文件路径添加到测试结果 result.add_result( passfail=ResultInfo.PASS if flag else ResultInfo.FAIL, actual_result=f"信息已保存到 {file_path}", test_comment='网卡信息存储', item_id='步骤2' ) self.logger.step('步骤3: 获取盘符') return result except Exception as e: result = ResultInfo() result.add_result(passfail=ResultInfo.FAIL, test_comment='Test fail: %s' % e) self.break_test('Test fail: %s' % e) def clean_test(self): try: self.logger.info('[clean_test] start to clean test...') except Exception as e: self.logger.error('[clean_test] clean test failed: %s' % e) raise e 根据该代码 补充步骤3获取盘符的python代码,并带有相应结果
08-20
import cantools import asammdf from asammdf import MDF, Signal import numpy as np import os import traceback import sys import can import glob def get_project_root(): """获取项目根目录(此脚本所在目录的父目录)""" script_dir = os.path.dirname(os.path.abspath(__file__)) # 修正__file__变量名 project_root = os.path.dirname(script_dir) return project_root def initialize_directories(): """初始化项目所需的所有目录结构""" root = get_project_root() # 定义各文件夹路径 dirs = { 'blf_input': os.path.join(root, 'blf_files'), 'mdf_output': os.path.join(root, 'mdf_files'), 'dbc_files': os.path.join(root, 'dbc_files'), 'scripts': os.path.join(root, 'convert_script') } # 创建不存在的目录 for dir_path in dirs.values(): if not os.path.exists(dir_path): os.makedirs(dir_path) print(f"创建目录: {dir_path}") return dirs def select_file_from_directory(directory, file_extension): """从指定目录选择一个指定扩展名的文件""" file_pattern = os.path.join(directory, f'*.{file_extension}') files = glob.glob(file_pattern) if not files: print(f"在目录 {directory} 中未找到 .{file_extension} 文件") return None # 如果只有一个文件,直接返回 if len(files) == 1: selected = files[0] print(f"自动选择 {file_extension.upper()} 文件: {os.path.basename(selected)}") return selected # 多个文件时让用户选择 print(f"\n在 {directory} 中找到以下 .{file_extension} 文件:") for i, file in enumerate(files, 1): print(f"{i}. {os.path.basename(file)}") while True: try: choice = int(input(f"请选择要使用的 {file_extension.upper()} 文件 (1-{len(files)}): ")) if 1 <= choice <= len(files): # 修正比较运算符 return files[choice - 1] else: print(f"请输入 1 到 {len(files)} 之间的数字") except ValueError: print("请输入有效的数字") return None # 添加明确的返回 def get_all_dbc_files(dbc_dir): """自动获取dbc_files目录中所有的DBC文件""" dbc_files = [] # 获取目录中所有DBC文件 dbc_pattern = os.path.join(dbc_dir, '*.dbc') all_dbc_files = glob.glob(dbc_pattern) if not all_dbc_files: print(f"在目录 {dbc_dir} 中未找到任何DBC文件,将不进行信号解析") return dbc_files # 按文件名排序,确保每次加载顺序一致 all_dbc_files.sort() print(f"\n在 {dbc_dir} 中找到 {len(all_dbc_files)} 个DBC文件,将全部用于解析:") for i, file in enumerate(all_dbc_files, 1): print(f"CAN通道 {i}: {os.path.basename(file)}") return all_dbc_files ### 核心修改开始 ### def blf_to_mdf(blf_file_path, mdf_output_dir, dbc_file_paths=None): """ 将BLF格式文件转换为MDF 3.x格式文件(.mdf后缀),支持多路CAN的DBC解析, 特别处理字符串型信号(如"err"),优化后解析效率更高 """ try: # 验证输入文件是否存在 if not os.path.exists(blf_file_path): raise FileNotFoundError(f"BLF文件不存在: {blf_file_path}\n请检查文件路径是否正确") if not blf_file_path.endswith('.blf'): raise ValueError(f"输入文件不是BLF格式: {blf_file_path}\n请确保输入文件的扩展名为.blf") # 生成输出MDF文件路径 blf_filename = os.path.basename(blf_file_path) mdf_filename = os.path.splitext(blf_filename)[0] + '.mdf' mdf_file_path = os.path.join(mdf_output_dir, mdf_filename) print(f"输出MDF文件路径: {mdf_file_path}") # 确保输出目录存在 if not os.path.exists(mdf_output_dir): os.makedirs(mdf_output_dir, exist_ok=True) print(f"创建输出目录: {mdf_output_dir}") # 加载多个DBC文件(每个对应一路CAN) dbc_databases = {} if dbc_file_paths and len(dbc_file_paths) > 0: for can_channel, dbc_path in enumerate(dbc_file_paths, 1): # 修正比较运算符 if not os.path.exists(dbc_path): raise FileNotFoundError(f"DBC文件不存在: {dbc_path}\n请检查DBC文件路径是否正确") if not dbc_path.endswith('.dbc'): raise ValueError(f"DBC文件格式不正确: {dbc_path}\n请确保DBC文件的扩展名为.dbc") try: print(f"加载CAN通道 {can_channel} 的DBC文件: {os.path.basename(dbc_path)}") dbc = cantools.database.load_file(dbc_path) dbc_databases[can_channel] = dbc # 存储通道与DBC的映射 except Exception as e: raise RuntimeError(f"加载DBC文件 {os.path.basename(dbc_path)} 失败: {str(e)}") from e # 使用python-can读取BLF文件 print(f"解析BLF文件: {os.path.basename(blf_file_path)}") message_count = 0 error_count = 0 # 存储信号数据,用集合辅助时间戳去重 signals_data = {} # 用于记录字符串信号的映射关系(信号名 -> {字符串: 编码值}) string_mappings = {} # 新增:提前创建时间戳偏移计数器,避免while循环重复检查 timestamp_offsets = {} # 遍历BLF文件中的消息 try: with can.BLFReader(blf_file_path) as reader: for msg in reader: message_count += 1 if message_count % 10000 == 0: # 优化:每10000条消息显示进度(减少IO) print(f"已处理 {message_count} 条消息...") # 验证消息对象是否包含必要属性 required_attrs = ['timestamp', 'arbitration_id', 'data', 'channel'] if not all(hasattr(msg, attr) for attr in required_attrs): # 优化检查逻辑 error_count += 1 continue # 获取CAN通道号 can_channel = msg.channel # 转换时间戳为纳秒 try: timestamp_ns = int(msg.timestamp * 1e9) # 直接转换为整数避免round except (TypeError, ValueError) as e: error_count += 1 continue # 新增:通道有效性检查 if can_channel not in dbc_databases: # 如果没有DBC定义,使用默认处理 signal_prefix = f"CAN{can_channel}.ID_{msg.arbitration_id:03X}" else: signal_prefix = f"CAN{can_channel}" # 新增:统一信号名生成逻辑 def get_signal_name(base_name): return f"{signal_prefix}.{base_name}" # 解析信号(按CAN通道匹配对应的DBC) if can_channel in dbc_databases: dbc = dbc_databases[can_channel] try: if msg.arbitration_id in dbc._frame_id_to_message: message = dbc.get_message_by_frame_id(msg.arbitration_id) decoded = message.decode(msg.data) # 存储每个信号 for signal_name, signal_value in decoded.items(): full_name = get_signal_name(f"{message.name}.{signal_name}") if full_name not in signals_data: signals_data[full_name] = { 'timestamps': [], 'values': [] } timestamp_offsets[full_name] = {} # 初始化偏移记录 # 优化:使用字典记录时间戳偏移 base_ts = timestamp_ns if base_ts in timestamp_offsets[full_name]: timestamp_offsets[full_name][base_ts] += 1 adj_ts = base_ts + timestamp_offsets[full_name][base_ts] else: timestamp_offsets[full_name][base_ts] = 0 adj_ts = base_ts signals_data[full_name]['timestamps'].append(adj_ts) signals_data[full_name]['values'].append(signal_value) else: # 处理DBC中未定义的CAN ID full_name = get_signal_name(f"UNDEFINED_ID_{msg.arbitration_id:03X}_Data") if full_name not in signals_data: signals_data[full_name] = { 'timestamps': [], 'values': [] } timestamp_offsets[full_name] = {} data_value = int.from_bytes(msg.data, byteorder='big') # 时间戳处理 base_ts = timestamp_ns if base_ts in timestamp_offsets[full_name]: timestamp_offsets[full_name][base_ts] += 1 adj_ts = base_ts + timestamp_offsets[full_name][base_ts] else: timestamp_offsets[full_name][base_ts] = 0 adj_ts = base_ts signals_data[full_name]['timestamps'].append(adj_ts) signals_data[full_name]['values'].append(data_value) except Exception as e: error_count += 1 else: # 没有对应DBC文件时处理 try: full_name = get_signal_name(f"ID_{msg.arbitration_id:03X}_Data") if full_name not in signals_data: signals_data[full_name] = { 'timestamps': [], 'values': [] } timestamp_offsets[full_name] = {} data_value = int.from_bytes(msg.data, byteorder='big') # 时间戳处理 base_ts = timestamp_ns if base_ts in timestamp_offsets[full_name]: timestamp_offsets[full_name][base_ts] += 1 adj_ts = base_ts + timestamp_offsets[full_name][base_ts] else: timestamp_offsets[full_name][base_ts] = 0 adj_ts = base_ts signals_data[full_name]['timestamps'].append(adj_ts) signals_data[full_name]['values'].append(data_value) except Exception as e: error_count += 1 print(f"消息处理完成 - 共处理 {message_count} 条消息,其中 {error_count} 条出错") if not signals_data: raise RuntimeError("未提取到任何信号数据,无法创建MDF文件") except Exception as e: raise RuntimeError(f"处理BLF消息时发生错误: {str(e)}") from e # 创建MDF文件 try: print("创建MDF文件(3.30版本,.mdf格式)...") mdf = MDF(version='3.30') signal_count = 0 for signal_name, data in signals_data.items(): if len(data['timestamps']) == 0: continue # 转换时间戳 try: timestamps = np.array(data['timestamps'], dtype=np.uint64) except Exception: continue # 处理信号值 try: # 尝试数值型转换 values = np.array(data['values'], dtype=np.float64) is_string_signal = False except (TypeError, ValueError): # 字符串型信号处理 is_string_signal = True if signal_name not in string_mappings: string_mappings[signal_name] = {} current_code = 0 else: current_code = len(string_mappings[signal_name]) encoded_values = [] for val in data['values']: str_val = str(val) if str_val not in string_mappings[signal_name]: string_mappings[signal_name][str_val] = current_code current_code += 1 encoded_values.append(string_mappings[signal_name][str_val]) values = np.array(encoded_values, dtype=np.int32) # 创建信号 can_channel = signal_name.split('.')[0][3:] if is_string_signal: mapping_desc = "; ".join([f"{k}={v}" for k, v in string_mappings[signal_name].items()]) comment = f"字符串信号映射: {mapping_desc}" unit = "编码" else: comment = "" unit = "" signal = Signal( samples=values, timestamps=timestamps, name=signal_name, unit=unit, comment=comment ) mdf.append(signal) signal_count += 1 if is_string_signal: print(f"信号 {signal_name} 为字符串型,映射关系: {string_mappings[signal_name]}") if signal_count == 0: raise RuntimeError("没有有效信号可添加到MDF文件") print(f"已添加 {signal_count} 个信号到MDF文件") # 保存MDF文件 print(f"保存MDF文件到: {mdf_file_path}") mdf.save(mdf_file_path, overwrite=True) print(f"转换完成! 文件大小: {os.path.getsize(mdf_file_path)/1024/1024:.2f} MB") except Exception as e: raise RuntimeError(f"创建MDF文件时发生错误: {str(e)}") from e except Exception as e: print(f"\n===== 转换失败 =====") print(f"错误类型: {type(e).__name__}") print(f"错误信息: {str(e)}") print(f"错误位置:") traceback.print_exc() raise ### 核心修改结束 ### def main(): # 初始化目录结构 print("===== BLF 转 MDF 工具(支持字符串型信号) =====") dirs = initialize_directories() print(f"\n项目根目录: {get_project_root()}") print(f"BLF文件目录: {dirs['blf_input']}") print(f"MDF输出目录: {dirs['mdf_output']}") print(f"DBC文件目录: {dirs['dbc_files']}") # 选择要转换的BLF文件 print("\n----- 选择BLF文件 -----") blf_file = select_file_from_directory(dirs['blf_input'], 'blf') if not blf_file: print("没有找到可转换的BLF文件,程序退出") sys.exit(1) # 自动获取所有DBC文件 print("\n----- 加载DBC文件 -----") dbc_files = get_all_dbc_files(dirs['dbc_files']) try: blf_to_mdf(blf_file, dirs['mdf_output'], dbc_files) except Exception as e: print(f"程序执行失败: {str(e)}") sys.exit(1) input("\n转换完成,按任意键退出...") if __name__ == "__main__": main() 我这是python代码不是HTML把语法修改成符合python
最新发布
09-04
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值