我需要读一个* .pb文件。我来到这个python库https://github.com/google/gtfs-realtime-bindings,它似乎能够将.pb文件解析成人类可读的格式。它还可以将对象序列化为二进制.pb
我的问题是我发现很难导航信息。
我这样加载:
feed = gtfs_realtime_pb2.FeedMessage()
response = requests.get(url)
feed.ParseFromString(response.content)
message=feed.entity
for item in message:
if item.id==trip_id:
if item.HasField('trip_update'):
#do something with the item's fields
我有两个问题: 我想迭代“trip_update”中包含的子字段并更改值。具体来说,我想要更改一些stop_time_updates。
喜欢这样
id: "61443658"
trip_update {
trip {
trip_id: "61443658"
start_time: "16:19:00"
start_date: "20171027"
schedule_relationship: SCHEDULED
route_id: "17529"
direction_id: 0
}
stop_time_update {
departure {
delay: 0
time: 1509113940
}
stop_id: "54376"
schedule_relationship: SCHEDULED
}
stop_time_update {
arrival {
delay: 0
time: 1509114240
}
departure {
delay: 0
time: 1509114240
}
stop_id: "54633"
schedule_relationship: SCHEDULED
之后,我只是序列化文件。 似乎没有任何可用的方法来导航此Feed实体对象。如果有一些方法可以做到这一点,我错过了它让我知道,否则,如果你能指出我正确的方向为我想做的正确的工具,我将不胜感激。
欢呼声
答案 0 :(得分:0)
您尚未准确指定要进行的更改,因此下面的代码示例假定您要将每个StopTimeEvents(到达和离开)的delay
字段更改为30秒。注意:我还没有真正测试过此代码。
feed = gtfs_realtime_pb2.FeedMessage()
response = requests.get(url)
feed.ParseFromString(response.content)
message = feed.entity
for item in message:
if not item.HasField('trip_update'):
continue
tu = item.trip_update
for stu in tu.stop_time_update: ## Loop over the stop_time_update repeated element
if stu.HasField('arrival'):
stu.arrival.delay = 30
if stu.HasField('departure'):
stu.departure.delay = 30
顺便说一句,看起来你只是在使用某些外部Feed生成器的API,所以我不清楚为什么你想要更改值而不是只读它们。 / p>