2014-07-10 5 views
6

में उपयोग के लिए प्रोटोकॉल बफर से ऑब्जेक्ट की तरह एक पायथन शब्दकोश बनाना, वर्तमान में मैं प्रोटोकॉल बफर प्रदान करने वाले सर्वर पर इंटरफ़ेस करता हूं। मैं संभावित रूप से बहुत बड़ी संख्या में संदेश प्राप्त कर सकता हूं। वर्तमान में मेरे प्रक्रिया प्रोटोकॉल बफ़र्स को पढ़ने के लिए और उन्हें एक पांडा DataFrame में कन्वर्ट (नहीं सामान्य रूप में एक आवश्यक कदम है, लेकिन पांडा डेटासेट विश्लेषण करने के लिए अच्छा उपकरण प्रदान करता है) है:पंडों

  1. पढ़ें प्रोटोकॉल बफ़र, यह एक गूगल Protobuf हो जाएगा
  2. Convert प्रोटोकॉल बफ़र्स आपत्ति protobuf_to_dict
  3. उपयोग pandas.DataFrame.from_records का उपयोग कर एक DataFrame

यह अच्छा काम करता है, लेकिन, संदेश मैं Protobuf से पढ़ने की बड़ी संख्या को देखते हुए प्राप्त करने के लिए डिक्शनरी में, यह ग के लिए काफी अक्षम है शब्दकोश के लिए आगे और फिर पांडा के लिए। मेरा सवाल यह है: क्या एक ऐसा वर्ग बनाना संभव है जो एक पाइथन प्रोटोबफ ऑब्जेक्ट को एक शब्दकोश की तरह दिख सके? यही है, चरण 2 हटाएं। कोई संदर्भ या छद्म कोड उपयोगी होगा।

+1

लेकिन' dictionary' को प्रोटोकॉल बफ़र्स कन्वर्ट एक अजगर Protobuf वस्तु एक शब्दकोश की तरह लग रहे बनाता है। – furas

+1

मैंने कोड को देखा, यह निश्चित रूप से * नहीं * ऐसा लगता है कि यह प्रोटोबफ ऑब्जेक्ट को लपेट रहा है, बल्कि एक वास्तविक नया शब्दकोश बनाता है। मेरा मानना ​​है कि @ जस्टिन कुछ ऐसी चीज की तलाश में है जो डेटा कॉपी करने के बिना ही लपेटता है। – user3820547

+0

हां, मैं Google protobuf ऑब्जेक्ट को डेटा को कॉपी करने के बजाए किसी शब्दकोष की तरह दिखाना चाहता हूं, पहले पाइथन dict पर। – Justin

उत्तर

3

आप ProtoText पायथन पैकेज को देखना चाहेंगे। यह आपके प्रोटोबफ ऑब्जेक्ट तक पहुंचने के लिए जगह-जगह जैसे-जैसे ऑपरेशन प्रदान करता है।

उदाहरण का उपयोग: मान लें कि आपके पास पाइथन प्रोटोबफ ऑब्जेक्ट person_obj है।) आप बल्कि कुछ `pandas.DataFrame.from_protbuf` जरूरत है, लेकिन मैं इस समस्या के लिए जवाब पता नहीं है,

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