我正在尝试使用Python从NYC地铁中读取和分析GTFS实时数据。到目前为止,我已经成功地使用gtfs-realtime.proto
和nyct-subway.proto
来生成正确的Python类并将protobuf数据解析为Python对象。
尝试访问这些对象中的某些字段时出现我的问题。例如,标题(feed.header
)如下所示:
gtfs_realtime_version: "1.0"
incrementality: FULL_DATASET
timestamp: 1533111586
[nyct_feed_header] {
nyct_subway_version: "1.0"
trip_replacement_period {
route_id: "A"
replacement_period {
end: 1533113386
...
我可以使用点访问来访问前三个属性,但是不能访问nyct_feed_header
。我怀疑这是因为它是nyct-subway.proto
扩展名的一部分,而其他三个是原始扩展名的一部分。
我发现此属性可以在feed.header.ListFields()中访问,但是由于它返回(名称,属性)对的列表,因此最好不要访问它。
为什么点访问无法访问扩展中的属性?有没有比使用ListFields更好或更优雅的访问方式?
答案 0 :(得分:1)
通过对象的Extensions
属性访问扩展名(请参见docs)。例如。 GTFS和NYCT扩展:
import gtfs_realtime_pb2 as gtfs
import nyct_subway_pb2 as nyct
feed = gtfs.FeedMessage()
feed.ParseFromString(...)
feed.entity[0].trip_update.trip.Extensions[nyct.nyct_trip_descriptor].direction