在python中迭代GTFS-RT protobuf消息并进行编辑

时间:2017-10-27 15:47:12

标签: python protocol-buffers gtfs

我需要读一个* .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实体对象。如果有一些方法可以做到这一点,我错过了它让我知道,否则,如果你能指出我正确的方向为我想做的正确的工具,我将不胜感激。

欢呼声

1 个答案:

答案 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>