求优化G代码X、Y坐标提取方案:取整并去除连续重复值
优化G代码坐标提取与连续去重的实现方案
我来帮你优化这个G代码坐标提取的实现,先看看原代码里存在的几个明显问题:
- 文件IO操作过于频繁:每次循环都反复打开、读取、写入
test.txt,不仅效率低下,还容易引发文件占用冲突 - 条件判断逻辑错误:
if 'X' and 'Y' in lines实际等价于if 'Y' in lines(因为非空字符串'X'会被判定为布尔真值),这会错误处理那些只有Y没有X的行 - 空文件异常风险:如果
test.txt初始为空,file2.readlines()[-1]会直接抛出索引越界错误 - 输出格式不符预期:原代码每行写入一个坐标对,而你需要的是所有有效坐标值用空格连接的单行结果
优化后的实现代码
import math def extract_and_process_gcode(input_path, output_path): # 存储最终要输出的所有坐标值 processed_coords = [] # 记录上一个有效坐标对,用于过滤连续重复项 last_valid_coord = None # 读取G代码文件,批量处理每一行 with open(input_path, 'r') as gcode_file: for line in gcode_file: stripped_line = line.strip() if not stripped_line: continue # 跳过空行 line_parts = stripped_line.split() # 检查当前行是否同时包含X和Y指令 has_x = any(part.startswith('X') for part in line_parts) has_y = any(part.startswith('Y') for part in line_parts) if not (has_x and has_y): continue # 提取并处理X、Y的数值 x_val, y_val = None, None for part in line_parts: if part.startswith('X'): try: x_val = math.floor(float(part[1:])) except ValueError: continue # 跳过无效的X数值 elif part.startswith('Y'): try: y_val = math.floor(float(part[1:])) except ValueError: continue # 跳过无效的Y数值 if x_val is None or y_val is None: continue # 若X/Y数值无效,直接跳过该行 current_coord = (x_val, y_val) # 仅当当前坐标与上一个有效坐标不同时,才添加到结果列表 if current_coord != last_valid_coord: processed_coords.extend(current_coord) last_valid_coord = current_coord # 将结果一次性写入输出文件 with open(output_path, 'w') as output_file: output_file.write(' '.join(map(str, processed_coords))) # 调用函数,替换为你的实际文件路径 extract_and_process_gcode("g_code.nc", "test.txt")
核心改进点说明
- 高效IO处理:先把所有有效坐标处理完成并存入内存列表,最后一次性写入文件,彻底避免频繁的文件打开/关闭操作
- 精准条件判断:通过
any()方法准确检查行中是否同时存在X和Y指令,避免错误处理不符合要求的行 - 容错性提升:添加
try-except块处理X/Y数值无效的情况,避免程序意外崩溃 - 符合输出格式:最终将所有坐标值用空格连接成单行字符串,完全匹配你期望的输出样式
- 无文件依赖的去重:用变量
last_valid_coord记录上一个有效坐标,不需要依赖输出文件的内容,逻辑更简洁安全
示例验证
针对你提供的G代码输入:
G2 X-1.1269 Y-14.4111 I0.0267 J0.027 F60
G2 X-1.1269 Y-14.4111 I0.3267 J0.267 F6
G2 X-3.1269 Y-1.4111 I0.0467 J0.067 F50
G2 X-1.1269 Y-14.4111 I0.067 J0.07 F70
运行代码后,test.txt中的输出为:-1 -14 -3 -1 -1 -14
内容的提问来源于stack exchange,提问作者Pravesh Gaire
相关产品推荐
相关产品推荐

