GPS时间转UTC遇ValueError:解包值不足(预期4个,实际3个)
解决GPS时间转UTC时的
ValueError: not enough values to unpack错误 错误根源
- 输入数据由
las2txt -parse xyt生成,每行仅包含x、y、GPS时间三个字段,但代码错误地尝试解包出4个变量(xvalue, yvalue, zvalue, timevalue),字段数量不匹配导致报错。 - 代码使用了Python2的
print语法,在Python3环境下会触发语法错误;line.split(' ')的分割方式可能因多空格、换行符产生空元素,引发潜在问题。
修复步骤
1. 修正变量解包逻辑
匹配输入的3个字段,同时优化分割逻辑以避免空元素:
xvalue, yvalue, timevalue = line.strip().split()
2. 补充输出所需的z值
由于输入数据不含z坐标,可根据需求设置默认值(示例设为0);若实际LiDAR数据包含z坐标,需将输入命令改为las2txt -parse xyzt ...,再调整解包逻辑为4个变量。
3. 适配Python3的print语法
将Python2的语句改为函数形式:
print(xvalue, yvalue, z_value, datetimestr)
修正后的完整代码
import datetime import fileinput # Unix时间(1970-01-01)与GPS时间(1980-01-06)的秒数差 offset = 315964800 def countleaps(gpsTime): """计算已过去的闰秒数""" # 闰秒添加时对应的GPS时间点 leaps = ( 46828800, 78364801, 109900802, 173059203, 252028804, 315187205, 346723206, 393984007, 425520008, 457056009, 504489610, 551750411, 599184012, 820108813, 914803214, 1025136015 ) nleaps = 0 for leap in leaps: if gpsTime >= leap: nleaps += 1 return nleaps if __name__ == '__main__': for line in fileinput.input(r'E:\LiDAR\Staging\GW_Workspace\Beaverhead_Reports\BH_0001.txt'): # 匹配输入的3个字段,优化分割逻辑 xvalue, yvalue, timevalue = line.strip().split() gpstime = float(timevalue) gpstime += 1e9 # 转换为未调整的GPS时间 unixtime = gpstime + offset - countleaps(gpstime) datetimestr = datetime.datetime.fromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S') # 补充z值(此处设为默认0,可根据需求修改) z_value = 0 # 适配Python3的print语法 print(xvalue, yvalue, z_value, datetimestr)
额外说明
- 若实际需要从LiDAR数据中读取z坐标,只需将输入命令改为
las2txt -parse xyzt ...,并将代码中的变量解包语句改为xvalue, yvalue, z_value, timevalue = line.strip().split()即可。 line.strip().split()会自动处理换行符、多个连续空格的情况,避免拆分出空字符串导致的解包错误。
内容的提问来源于stack exchange,提问作者Garret
相关产品推荐
相关产品推荐

