Python解析txt坐标列表时如何正确提取坐标值到对应列表
问题根源
你之前用的固定字符偏移切片方案,仅适用于所有行长度完全一致、所有坐标整数部分位数固定的场景。当出现1012.0这类4位整数的坐标时,对应行总长度会增加1个字符,全局固定步长37的循环会从错位的位置开始切片,后续所有行的索引基准全部偏移,仅靠局部调整偏移参数无法修正全局错位问题,最终就会出现你拿到的乱码式切片结果。
可行解决方案
不要靠数字符位置做提取,直接匹配数据的固定结构实现解析,两种常用方案都可以彻底规避长度变化导致的错位:
方案1:正则匹配提取(最简洁,鲁棒性最强)
直接通过正则规则匹配[0 [x,y]][1 [x,y]]的固定结构,自动捕获四个坐标值,完全不受坐标整数部分位数变化影响:
import re head_x = [] head_y = [] foot_x = [] foot_y = [] # 匹配所有符合格式的坐标组,自动提取四个坐标值 match_res = re.findall(r'\[0 \[([\d.]+), ([\d.]+)\]\]\[1 \[([\d.]+), ([\d.]+)\]\]', data) for hx, hy, fx, fy in match_res: # 需要数值类型就转float,需要字符串直接append即可 head_x.append(float(hx)) head_y.append(float(hy)) foot_x.append(float(fx)) foot_y.append(float(fy))
运行后可以直接得到所有行的正确坐标,哪怕后续出现5位整数的坐标值,也不需要修改代码。
方案2:按行拆分后逐段解析(无需引入正则库)
先把完整数据按换行符拆分为独立行,再通过固定分隔符切割每一行提取坐标,同样不需要数字符偏移:
head_x = [] head_y = [] foot_x = [] foot_y = [] # 拆分所有非空行 lines = [line.strip() for line in data.split('\n') if line.strip()] for line in lines: # 先拆分点0、点1的内容段 p0_seg, p1_seg = line.split('][1 ') # 提取点0的x、y坐标 hx, hy = p0_seg.split('[')[-1].rstrip(']').split(', ') # 提取点1的x、y坐标 fx, fy = p1_seg.lstrip('[').rstrip(']]').split(', ') # 存入对应列表 head_x.append(float(hx)) head_y.append(float(hy)) foot_x.append(float(fx)) foot_y.append(float(fy))
注意:如果需要保留字符串格式的坐标值,去掉
float()转换直接append即可。
内容的提问来源于stack exchange,提问作者Junwoo Kim
相关产品推荐
相关产品推荐

