我有一位正在完成航空航天工程硕士学位的朋友.对于他的最终项目,他是一个小团队,负责编写跟踪气象气球,火箭和卫星的程序.该程序接收来自GPS设备的输入,对数据进行计算,并使用这些计算的结果来控制一系列设计用于定向定向通信天线的电机,因此气球,火箭或卫星始终保持对焦.
虽然我自己有点像一个(永恒的)初学者,但我的编程经验比我的朋友多.所以,当他向我征求意见时,我说服他用我选择的语言Python编写程序.
在项目的这一点上,我们正在研究解析GPS设备输入的代码.这是一些示例输入,我们需要以粗体提取数据:
$ GPRMC,092204.999,4250.5589,S,14718.5084,E,1,12,24.4,89.6,男,, 0000*1F $ GPRMC,093345.679,4234.7899,N,11344.2567,W,3,02,24.5,1000.23,男,,, 0000*1F $ GPRMC,044584.936,1276.5539,N,88734.1543,E,2,04,33.5,600.323,M ,,,*00 $ GPRMC,199304.973,3248.7780,N,11355.7832,W,1,06, 02.2,25722.5,男,,,*00 $ GPRMC,066487.954,4572.0089,S,45572.3345,W,3,09,15.0,35000.00,男,,,*1F
以下是对数据的进一步解释:
"我看起来每行都需要五件事.请记住,这些区域中的任何一个都可能是空的.意思是只有两个逗号紧挨着.例如',,,'那里是两个可能随时都满的领域.有些领域可能只有两三个选项,但我不认为我应该指望它."
两天前,我的朋友能够从用于追踪最近气象气球发射的GPS接收器获取完整的日志.数据很长,所以我把它全部放在这个pastebin中.
我自己对正则表达式仍然很新,所以我正在寻求一些帮助.
分裂应该做的伎俩.这是一种提取数据的好方法:
>>> line = "$GPRMC,199304.973,3248.7780,N,11355.7832,W,1,06,02.2,25722.5,M,,,*00" >>> line = line.split(",") >>> neededData = (float(line[2]), line[3], float(line[4]), line[5], float(line[9])) >>> print neededData (3248.7779999999998, 'N', 11355.7832, 'W', 25722.5)
使用拆分比使用正则表达式更简单.
>>> line="$GPRMC,092204.999,4250.5589,S,14718.5084,E,1,12,24.4,89.6,M,,,0000*1F " >>> line.split(',') ['$GPRMC', '092204.999', '4250.5589', 'S', '14718.5084', 'E', '1', '12', '24.4', '89.6', 'M', '', '', '0000*1F '] >>>
这些是逗号分隔值,因此使用csv库是最简单的解决方案.
我把你的样本数据扔进/ var/tmp/sampledata,然后我这样做了:
>>> import csv >>> for line in csv.reader(open('/var/tmp/sampledata')): ... print line ['$GPRMC', '092204.999', '**4250.5589', 'S', '14718.5084', 'E**', '1', '12', '24.4', '**89.6**', 'M', '', '', '0000\\*1F'] ['$GPRMC', '093345.679', '**4234.7899', 'N', '11344.2567', 'W**', '3', '02', '24.5', '**1000.23**', 'M', '', '', '0000\\*1F'] ['$GPRMC', '044584.936', '**1276.5539', 'N', '88734.1543', 'E**', '2', '04', '33.5', '**600.323**', 'M', '', '', '\\*00'] ['$GPRMC', '199304.973', '**3248.7780', 'N', '11355.7832', 'W**', '1', '06', '02.2', '**25722.5**', 'M', '', '', '\\*00'] ['$GPRMC', '066487.954', '**4572.0089', 'S', '45572.3345', 'W**', '3', '09', '15.0', '**35000.00**', 'M', '', '', '\\*1F']
然后,您可以根据需要处理数据.在某些值的开头和结尾处使用'**'看起来有点奇怪,你可能想要删掉那些东西,你可以这样做:
>> eastwest = 'E**' >> eastwest = eastwest.strip('*') >> print eastwest E
您必须将某些值转换为浮点数.例如,第一行样本数据的第3个值是:
>> data = '**4250.5589' >> print float(data.strip('*')) 4250.5589