如何修改CSV处理脚本以跳过LASER_ON/LASER_OFF行并补全X/Y值
机床CSV坐标补全脚本修改方案(兼容LASER指令行)
我有一个包含简化机床程序的CSV文件,内容如下:
X51.972,Y1433.401 LASER_ON X41.972 Y1438.401 X51.97 LASER_OFF X51.972,Y1382.401 LASER_ON X41.972 Y1377.401 X51.97
需求是:
- 当某行只有X值时,自动补全上一行的Y值
- 当某行只有Y值时,自动补全上一行的X值
- 跳过所有
LASER_ON和LASER_OFF行
原脚本仅在无LASER指令行时有效,修改方案如下:
关键修改点
- 跳过LASER指令行:读取每行时直接判断并跳过激光控制指令,不进入坐标处理逻辑
- 维护独立坐标状态:用单独变量保存最新的X、Y坐标,避免依赖输出列表的历史项,逻辑更清晰且避免索引错误
修改后的完整脚本
import csv # 替换为你的目标文件路径 output_csv_file = "machine_program.csv" processed_lines: list[tuple[str, str]] = [] last_valid_x = None last_valid_y = None with open(output_csv_file, 'r') as input_file: for line in map(str.strip, input_file): # 跳过空行和LASER指令行 if not line or line.startswith(("LASER_ON", "LASER_OFF")): continue coordinate_parts = line.split(",") if coordinate_parts[0].startswith("X"): current_x = coordinate_parts[0] # 处理带Y值的完整行或仅X的单行 if len(coordinate_parts) > 1 and coordinate_parts[1].startswith("Y"): current_y = coordinate_parts[1] last_valid_y = current_y else: current_y = last_valid_y processed_lines.append((current_x, current_y)) last_valid_x = current_x elif coordinate_parts[0].startswith("Y"): current_y = coordinate_parts[0] # 处理带X值的完整行或仅Y的单行 if len(coordinate_parts) > 1 and coordinate_parts[1].startswith("X"): current_x = coordinate_parts[1] last_valid_x = current_x else: current_x = last_valid_x processed_lines.append((current_x, current_y)) last_valid_y = current_y # 写入处理后的内容 with open(output_csv_file, 'w', newline='') as output_file: csv_writer = csv.writer(output_file) csv_writer.writerows(processed_lines)
脚本说明
- 新增空行和LASER指令行的过滤逻辑,直接跳过无需处理的内容
- 用
last_valid_x和last_valid_y记录最近一次的有效坐标,处理单行X/Y时直接取用,避免依赖输出列表的历史项 - 保留原有的坐标补全逻辑,每次处理后自动更新最新坐标状态
- 兼容完整坐标行(同时带X、Y)和单行坐标的处理场景
内容的提问来源于stack exchange,提问作者volk.SWAG.en
相关产品推荐
相关产品推荐

