2014-07-10 11 views
6

Attualmente si interfaccia a un server che fornisce buffer di protocollo. Posso potenzialmente ricevere un numero molto elevato di messaggi. Attualmente il mio processo per leggere i buffer di protocollo e convertirli in un Pandas dataframe (non un passo necessario in generale, ma Panda offre piacevoli strumenti per l'analisi di insiemi di dati) è:creazione di un dizionario python come oggetto da buffer di protocollo da utilizzare nei panda

  1. Leggi buffer di protocollo, sarà un protobuf google oggetto
  2. buffer di protocollo Converti al dizionario utilizzando protobuf_to_dict
  3. uso pandas.DataFrame.from_records per ottenere un dataframe

Questa grande opera, ma, dato il gran numero di messaggi che ho letto dal protobuf, è abbastanza inefficiente per c passa al dizionario e poi ai panda. La mia domanda è: è possibile creare una classe che possa far sembrare un oggetto protobuf python come un dizionario? Cioè, rimuovere il passaggio 2. Qualsiasi riferimento o pseudocodice sarebbe utile.

+1

Ma 'Convertire buffer di protocollo per dictionary' rende un oggetto protobuf pitone sembrare un dizionario;) È piuttosto bisogno di un po' pandas.DataFrame.from_protbuf' ma non si conosce la risposta a questo problema. – furas

+1

Ho guardato il codice, sicuramente * non * sembra che stia avvolgendo l'oggetto protobuf, ma piuttosto crea un vero nuovo dizionario. Credo che @Justin stia cercando qualcosa che avvolge solo, senza copiare i dati. – user3820547

+0

Sì, vorrei fare in modo che l'oggetto protobuf di google assomigli ad un dizionario piuttosto che copiare i dati su python prima. – Justin

risposta

3

È possibile controllare il pacchetto python ProtoText. Fornisce operazione dict-like sul posto per accedere al tuo oggetto protobuf.

Esempio di utilizzo: Si supponga di avere un oggetto protobuf python person_obj.

import ProtoText 
print person_obj['name']  # print out the person_obj.name 
person_obj['name'] = 'David' # set the attribute 'name' to 'David' 
# again set the attribute 'name' to 'David' but in batch mode 
person_obj.update({'name': 'David'}) 
print ('name' in person_obj) # print whether the 'name' attribute is set in person_obj 
# the 'in' operator is better than the google implementation HasField function 
# in the sense that it won't raise Exception even if the field is not defined