2014-07-10 20 views
6

Tôi hiện đang giao tiếp với máy chủ cung cấp bộ đệm giao thức. Tôi có khả năng nhận được rất nhiều tin nhắn. Hiện nay quá trình của tôi để đọc vùng đệm giao thức và chuyển đổi chúng sang một Pandas DataFrame (không phải là một bước cần thiết nói chung, nhưng Pandas cung cấp các công cụ tốt đẹp cho việc phân tích bộ dữ liệu) là:tạo từ điển python như đối tượng từ bộ đệm giao thức để sử dụng trong gấu trúc

  1. đọc vùng đệm giao thức, nó sẽ là một protobuf google đối tượng
  2. đệm giao thức Chuyển đổi vào từ điển bằng protobuf_to_dict
  3. sử dụng pandas.DataFrame.from_records để có được một DataFrame

này hoạt động tuyệt vời, nhưng do số lượng lớn các tin nhắn tôi đọc từ protobuf, nó là khá hiệu quả để c chuyển sang từ điển và sau đó là gấu trúc. Câu hỏi của tôi là: có thể tạo một lớp có thể tạo một đối tượng protobuf python trông giống như một từ điển không? Đó là, loại bỏ bước 2. Bất kỳ tài liệu tham khảo hoặc mã giả sẽ hữu ích.

+1

Nhưng 'Chuyển đổi bộ đệm giao thức để dictionary' làm cho một đối tượng protobuf python trông giống như một cuốn từ điển;) Bạn khá cần một số' pandas.DataFrame.from_protbuf' nhưng tôi không biết câu trả lời cho vấn đề này. – furas

+1

Tôi nhìn vào mã, nó chắc chắn không * không * trông giống như nó gói các đối tượng protobuf, nhưng thay vì tạo ra một từ điển mới thực sự. Tôi tin @Justin đang tìm kiếm thứ gì đó chỉ kết thúc tốt đẹp mà không cần sao chép dữ liệu. – user3820547

+0

Có, tôi muốn làm cho đối tượng protobuf google trông giống như một từ điển hơn là sao chép dữ liệu vào dict python đầu tiên. – Justin

Trả lời

3

Bạn có thể muốn kiểm tra gói python ProtoText. Nó cung cấp hoạt động giống như dict tại chỗ để truy cập đối tượng protobuf của bạn.

Ví dụ sử dụng: Giả sử bạn có đối tượng 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 
Các vấn đề liên quan