2016-04-27 18 views
0

protobufファイルからメッセージを読みました。私はGoogleのprotobufファイルへのアクセス(簡単)

print(mySerializedData.processed_row[0].timestamp) 
>> 0.0 
print(mySerializedData.processed_row[1].timestamp) 
>> 0.0049 

しかし、何のような個別のデータにアクセスすることができます[NDATA、NVAR]

print(mySerializedData.processed_row) 
>> [timestamp: 0.0 
linear_acc_x: 0.288501300049 
linear_acc_y: 0.573411297607 
linear_acc_z: 0.161608612061 
, timestamp: 0.0049 
linear_acc_x: 0.428562097168 
linear_acc_y: 0.685938775635 
linear_acc_z: 0.221463653564 
, timestamp: 0.01 
linear_acc_x: 0.45968671875 
linear_acc_y: 0.738611212158 
linear_acc_z: 0.185550628662] 

メッセージは、時系列データが含まれているので、私は、マトリックス状の構造を予想、例えば、processed_row私が取得したい

print(mySerializedData.processed_row[:].timestamp) 

のようなものです。しかし、それは誤りAttributeError: 'list' object has no attribute 'timestamp'

を示し
print(type(mySerializedData.processed_row[0].timestamp)) 
>> <type 'float'> 
print(type(mySerializedData.processed_row[0])) 
>> <class 'PushCore_pb2.ProcessedDataRow'> 

[:]のようにtimestamp倍配列を取得する方法はありますか?

はあなたがlist comprehensionを使用して、タイムスタンプ値のリストを作成することができ、あなたに

+0

しかし、あなたは二重の配列を持っていません。 'mySerializedData.processed_row [:]'はその行/リストのコピーを返します。 –

答えて

0

ありがとう:

[element.timestamp for element in mySerializedData.processed_row] 

ここでは一般化した例です。 example.protoで:Pythonで、

protoc --python_out=. example.proto 

その後:

package example; 

message Element { 
    required double timestamp = 1; 
    required string data = 2; 
} 

message Container { 
    repeated Element elements = 1; 
} 

使用して対応するPythonの出力を生成します

>>> from example_pb2 import Container, Element 
>>> 
>>> container = Container(
... elements=[ 
...  Element(timestamp=.1, data='Some data.'), 
...  Element(timestamp=.2, data='Some more data.'), 
... ] 
...) 
>>> 
>>> [element.timestamp for element in container.elements] 
[0.1, 0.2] 
関連する問題