1. 程式人生 > >pickle/cPickle操作函式、物件及在ROS中釋出複雜訊息

pickle/cPickle操作函式、物件及在ROS中釋出複雜訊息

簡介

官方API
這個模組主要是做資料序列化和序列化資料解析的,pickle是python語言的庫,cPickle是C語言寫的,後者的執行速度是前者的1000倍。但是cPickle對少數模組不支援。
使用這兩個庫的資料必須是python相關的,否則其他非python語言可能無法解析這些序列化資料。

主要介面

pickle.dump(obj, file[, protocol])
#Write a pickled representation of obj to the open file object file.
#protocol 這裡預設是0, 儲存的檔案在一些編輯器會顯示奇怪,用2可以解決這個問題,下同。
pickle.load(file) #Read a string from the open file object file and interpret it as a pickle data stream, reconstructing and returning the original object hierarchy. pickle.dumps(obj[, protocol]) #Return the pickled representation of the object as a string, instead of writing it to a file. pickle.loads(string) #Read a pickled object hierarchy from a string.

API使用舉例

import pickle
# import cPickle as ...
pickle.dump("123", open("test.txt","wb")) #pickle into file
str1 = pickle.load(open("test.txt","rb")) #load from pickled file

當然在dump或者load過程中遇到錯誤會有異常丟擲,可以檢視上面的API獲取異常的型別。

操作複雜物件

pickle操作複雜資料結構或者物件、函式等:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
############################ #File Name: pickle_test.py #Author: Wang #Mail: [email protected] #Created Time:2017-09-23 16:56:53 ############################ from pickle import * my_dict = {'name':'wang', 'age':15} print "initial dict: ", my_dict ss = dumps(my_dict) tt = loads(ss) print "loaded dict: ", tt def my_func(x, y): print "the number inputted: %d,%d, sum is: "%(x,y), return x + y ss = dumps(my_func) tt = loads(ss) print "loaded function: ", tt(2,4) import numpy as np class My_class: def __init__(self): self.name = "Lee" self.sex = "male" self.index = np.array([1,2,3]) def set_name(self, newname): self.name = newname def get_sub(self, a, b): return a - b my_obj = My_class() my_obj.set_name("Zhao") print my_obj ss = dumps(my_obj) tt = loads(ss) print tt print tt.name, tt.index, tt.get_sub(12,10) ''' Results: initial dict: {'age': 15, 'name': 'wang'} loaded dict: {'age': 15, 'name': 'wang'} loaded function: the number inputted: 2,4, sum is: 6 <__main__.My_class instance at 0x7f917a3c42d8> <__main__.My_class instance at 0x7f9162d8d290> Zhao [1 2 3] 2 '''

從上面結果知,pickle可以處理python的函式、複雜資料和物件,但是物件儲存也是把之前的物件拷貝下來,比如這裡列印結果是Zhao不是初始化的Wang。

和ROS結合

這裡dumps()將資料壓縮成字串格式,在rospy裡面可以把這種String訊息型別發出去,從而實現在ros裡複雜結構、函式和物件的釋出。舉例:

#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import String
from pickle import *

import numpy as np
class My_class:
    def __init__(self):
        self.name = "Lee"
    self.sex = "male"
    self.index = np.array([1,2,3])
    def set_name(self, newname):
        self.name = newname
    def get_sub(self, a, b):
        return a - b

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = dumps(My_class)
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

相關推薦

pickle/cPickle操作函式物件ROS釋出複雜訊息

簡介 官方API 這個模組主要是做資料序列化和序列化資料解析的,pickle是python語言的庫,cPickle是C語言寫的,後者的執行速度是前者的1000倍。但是cPickle對少數模組不支援。 使用這兩個庫的資料必須是python相關的,否則其

函式物件在記憶體存在形式

一、php底層記憶體分割槽 php將記憶體分為5個區。堆區一般存物件,棧區一般存基本資料型別(普通變數……)和函式,全域性區存全域性變數和靜態變數,常量區存常量,程式碼區存程式碼。 二、函式呼叫時棧區變化 這是一個簡單的遞迴函式示例。當主函式呼叫counts函式時,開闢

《隨筆一》——C#的“靜態建構函式物件初始化語句”

  靜態建構函式 ● 我們在使用類中的靜態成員時,先要初始化這些成員。 在宣告靜態成員時、可以同時提供一個初始值。 但有時候我們需要執行更復雜的初始化操作, 這應該怎麼辦呢? ● 我們可以把建構函式宣告成static的, 一般來說, 靜態的建構函式初始化類的靜態欄位

MATLABOpenCVRos下相機內參標定整理

轉載自:https://blog.csdn.net/yph001/article/details/80287853 一、引言 關於相機標定,其主要可以在MATLAB、OpenCv和ros下進行標定,標定方法很大一部分是參考張正友標定的方法。 二、MATLAB環境下相機標定方法

javascript函式物件原型鏈等的深入自我理解

js中以物件為核心,所有皆物件。 狹義的講,js中的物件比較純粹,就是一個大括號包裹的鍵值對,鍵為名(有待深入解析,可能就是語法本身),值為物件。 這個基本要素和C++比較接近,並沒有憑空創造出新的語法來完成這個物件(類)的構造過程。 函式本身是物件,可以作為物件中的值

深入理解JavaScript函式建構函式物件prototype(原型物件)的關係。

學了這麼久前端,一直搞不明白函式與物件之間的關係,實在慚愧,是時候總結一下了。。以下是學習時的記錄,若有錯誤之處,請指出。。 首先我們要知道js中的資料型別有以下幾種: Number   Boolean   undefined     Object &

【Java-16】Java字串表示字串一些重要操作函式整數與字串轉換

Java中有一個字串型別String,實際上確切說是有一個字串類,而類可以等價看作一個數據型別,所以我們就把String看成字串型別,String[]自然就是字串陣列,且對於每一個字串其都附帶很多方法,如字串切割等,具體看程式碼註釋解釋 package array; public class

小程式開發之元件事件處理函式routesetData介紹

元件事件處理函式 Page 中還可以定義元件事件處理函式。在渲染層的元件中加入事件繫結,當事件被觸發時,就會執行 Page 中定義的事件處理函式。 .wxml <view bindtap="viewTap">click me</view> .js

軟體測試的定義物件原則

軟體測試的定義:為了發現錯誤執行程式的過程。 軟體測試的物件:需求分析、概要設計、詳細設計以及程式編碼等各階段所得到的文件,包括需求規格說明、概要設計規格說明、詳細設計規格說明以及源程式。 軟體測試

this指標在普通函式物件方法定時器建構函式事件函式call()apply()的執行

前導: this是JavaScript中的一個關鍵字,在不同的場景中,this指向的物件也不同。在其他面嚮物件語言中(如C#),this就是指向當前物件。而在JavaScript 中this是在程式碼執行時繫結的,相對而言this指向比較混亂。在程式碼執行時th

python_11(format轉義字元連線字元字串操作函式字串反轉)

——————–資料格式化—————————- #!/usr/bin/python # -*- coding: UTF-8 -*- # 格式化字串 str1 = "version" num = 1

玩轉Unity資源物件序列化(上)(下)

如果在Unity編輯器處於關閉狀態時丟失.meta檔案,或資原始檔被移動但沒有移動對應的.meta檔案時,所有對資原始檔中的Object的引用都會丟失 複合資源和匯入器 正如前面第一節[深入理解資源與物件]中所說的一樣,不能被Unity直接支援的資源型別必須經過匯入才可以使用——使用資源匯入器來完成

Day40this指標和常函式解構函式物件的建立和銷燬過程拷貝構造和拷貝賦值(深拷貝淺拷貝!)

一、            this和常函式 1、 this 指標 1)     類中的建構函式和成員函式都隱藏一個該類型別的指標引數,引數名為this。 2)     對於普通的成員函式,this指標就是指向呼叫該函式的物件 3)     對於建構函式,this指標指向正

編寫高質量程式碼:改善Java程式的151個建議(第3章:類物件方法___建議31~40)

書讀的多而不思考,你會覺得自己知道的很多。 書讀的多而思考,你會覺得自己不懂的越來越多。  -----江疏影 在面向

python基本操作-檔案目錄路徑

[toc] > 使用python的os模組,簡單方便完成對資料夾、檔案及路徑的管理與訪問操作。 ## 1 前言 在最近開發中,經常需要對檔案進行讀取、遍歷、修改等操作,想要快速、簡單的完成這些操作,我選擇用 python 。通過 python 的標準內建 os 模組,只需要幾行程式碼,即可完成想

java類和物件python的類似實現

一:java類和物件 首先,我們簡單說一下類和物件的理解:所有男的這相當於一個“類”,而某個具體的人就是一個“物件” 類:當做物件的模板 物件:根據類建立,在java中,使用關鍵詞new建立新物件 java中定義一個類: public class Dog { String

中文亂碼解決之一 JS的編碼解碼C#對應的解碼編碼

JS的編碼、解碼及C#中對應的解碼、編碼 1、escape 定義和用法 escape對字串資料編碼,如果是對url進行編碼必須用encodeURI或是encodeURLComponent,解碼使用:unescape。 返回值 字符集是unicode,編碼成16進位制。 說明

第6章建立函式-----------(在.bashrc檔案定義函式在命令列建立函式在命令列使用函式)

6.6在命令列中使用函式          指令碼函式可以用於建立比較複雜的操作。指令碼函式不僅可以用作shell指令碼命令,也可以用作命令列介面的命令。一旦在shell中定義了函式,可以從系統的任意目錄使用這個函式。不必擔心PATH環境變數是否包含函式檔案所在目錄。關鍵是

spark三種清理資料的方式:UDF,自定義函式,spark.sql;Python的zip()與*zip()函式詳解//python的*args和**kwargs

(1)UDF的方式清理資料 import sys reload(sys) sys.setdefaultencoding('utf8') import re import json from pyspark.sql import SparkSession

新手Git for Windows 的安裝配置 GitHub專案下載

一、Git安裝 1. 下載最新版本雙擊執行 2.  安裝過程   在這裡選擇 Use Git from Git Bash only (最安全的選項,表示僅能在git bash裡面使用git命令,