收到的清单比预期的要大

时间:2013-06-13 15:12:25

标签: python iterable-unpacking

我正在研究gps跟踪器的nmea处理,我在这里将其作为值列表处理

"""
information package exmaple
41719.285,A,1623.5136,S,07132.9184,W,017.8,203.5,040613,,,A*6B|1.6|2375|1010|0000,0000|02CC000A138E96D6|11|0029560C
"""
gprmc, hdop, altitude, state, ad, baseid, csq, journey = information.split('|')
ptime, gpsindicator, lttd, ns, lgtd, ew, speed, course, pdate, dd, checksum = gprmc.split(',')

然后,有时数据包更大,但是形成得很好,这是因为有些客户使用额外数据重新配置设备而不是他们需要的程序并使我的程序崩溃,所以我正在寻找一种方法,我的代码不会在这些情况下崩溃。

5 个答案:

答案 0 :(得分:1)

你的解析器很简单。 如果有一个“”,则在最后一个预期属性之后,在“”之后读取正好2个字符,即校验和。 纠正它以在“*”之后准确读取2个字符。

通常NMEA是唯一的标准,但它没有明确规定。 每个GPS制造商都以自己的方式解释它。 编写通用的NMEA解析器非常困难,您可以查看GPSBable源代码,并了解他们考虑的特殊接收器的大量特殊情况。

此外,您提供的示例无效。 有效的NMEA句子以“$”作为第一个字符开头。 例如$ GPRMC

答案 1 :(得分:1)

快速修复:

"""
information package exmaple
41719.285,A,1623.5136,S,07132.9184,W,017.8,203.5,040613,,,A*6B|1.6|2375|1010|0000,0000|02CC000A138E96D6|11|0029560C
"""
# Unpack only the eight first values to the eight variables
gprmc, hdop, altitude, state, ad, baseid, csq, journey = information.split('|')[:8]
# Unpack only the eleven first values to the eleven variables
ptime, gpsindicator, lttd, ns, lgtd, ew, speed, course, pdate, dd, checksum = gprmc.split(',')[:11] 

当然,更好的方法是事先检查信息的有效性及其计数。

答案 2 :(得分:1)

使用切片

gprmc, hdop, altitude, state, ad, baseid, csq, journey = information.split('|')[:8]
data = gprmc.split(',')
ptime, gpsindicator, lttd, ns, lgtd, ew, speed, course, pdate, dd = data[:10] 
checksum = data[-1] 
python 3.x中的

您可以使用通配符

gprmc, hdop, altitude, state, ad, baseid, csq, journey, *_ = information.split('|')
(ptime, gpsindicator, lttd, ns, lgtd, 
 ew, speed, course, pdate, dd, *_, checksum) = gprmc.split(',')

答案 3 :(得分:1)

有点侧面回答,因为我有点不习惯......

如果您对使用Python解析的有效GPS数据(特别是NMEA 0183)感兴趣,您可能会对twisted.positioning感兴趣:我正试图以扭曲的方式着陆,它会处理您需要的所有严重粗糙的东西从GPS设备中获取有用的数据。

或者,您可能对gpsd感兴趣,以填补相同的角色。最终,twisted.positioning将获得一个gpsd提供程序,以便您可以编写相同的代码,但让它通过gpsd提供数据。或者,如果您如此倾向,您可以从其他地方获取定位数据 - 界面非常通用。

答案 4 :(得分:0)

您可以以固定方式引用字段,例如:

inputStr = "a,b,c";
mylist = inputStr.split(',');
print mylist[0];

print mylist[len(mylist) - 1];

C

“len(mylist) - 1”可以从最后一个字段中取出校验和。