python 對象序列化 pickling_python操作文件——序列化pickling和JSON

當我們在內存中定義一個dict的時候,我們是可以隨時修改變量的內容的:

>>> d=dict(name='wc',age=28)>>>d

{'name': 'wc', 'age': 28}

我們可以隨時修改name和age的值。但是當我們重新運行程序的時候,name、age的初始化值還是wc和28,實際情況下我們需要保存該dict的最后的值。

我們把變量從內存中變成可存儲或傳輸的過程稱之為序列化。python中稱之為pickling,Java中叫serialization,都是一個意思。序列化之后我們就可以把內容寫入到磁盤或者通過網絡傳輸出去。反之,把變量從序列化的對象重新讀取到內存中稱之為反序列化,洋名叫unpickling。

python中實現序列化的模塊叫pickle。pickle.dumps()方法可以把任意的對象序列化成一個Bytes,然后就可以把這個bytes寫入文件。pickle.dump()方法可以直接把對象序列化寫入一個file-like的對象中。相反的,pickle.loads()方法可以把文件中的內容讀入到一個bytes,然后把這個bytes對象轉換為目標類型對象,也可以使用pickle.load()方法直接從一個file-like對象中直接反序列化出對象:

>>> f = open('E:\\python3.6.3\\workspace\\dump.txt','wb')>>>pickle.dump(d,f)>>>f.close()>>> f=open('E:\\python3.6.3\\workspace\\dump.txt','rb')>>> c =pickle.load(f)>>>c

{'name': 'wc', 'age': 28}

JSON

實際開發中我們或多或少都會碰到跨語言傳輸數據的問題,這就要求我們要把對象序列化為標準格式,比如JSON和XML。JSON的表現形式就是一個字符串,可以被所有的語言讀取。可以方便的存儲到磁盤或者通過網絡傳輸。JSON表示的對象是標準的JavaScript的對象,其和python內置的數據類型的對應關系如下:

JSON類型

Python類型

{}

dict

[]

list

""

str

123.4

int 或 float

true/false

True/False

null

None

python內置了json模塊可以方便的在python對象和json對象之間轉換:

>>> importjson>>> d=dict(name='wc',age=28)>>>json.dumps(d)'{"name": "wc", "age": 28}'

>>> c =json.dumps(d)>>> d=json .loads(c)>>>d

{'name': 'wc', 'age': 28}

python內置的數據類型可以直接轉換為json類型,但是class對象并不刻意直接轉為json,這是因為class對象默認的并不具有可序列化的屬性。

2種方法,第一種是通過dumps()方法的default參數,把任意一個對象轉換為一個可序列化的對象。下面的例子中,先定義一個Student的class,然后定義一個student2dict()函數,該函數的作用就是把Student的屬性轉換為dict,最后再序列化為json:

>>> importjson>>> classStudent(object):

...def __init__(self,name,age):

... self.name=name

... self.age=age

...>>> defstudent2dict(s):

...return {'name':s.name,'age':s.age}

...>>> s=Student('wc',28)>>> print(json.dumps(s,default=student2dict))

{"name": "wc", "age": 28}

第二種方法,借用class對象的__dict__屬性:

>>> classTeacher(object):

...def __init__(self,name,age):

... self.name=name

... self.age=age

...>>> t = Teacher('ly',90)>>> print(json.dumps(t,default=lambda obj:obj.__dict__))

{"name": "ly", "age": 90}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457502.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python實現Redis訂閱發布

Redis 發布訂閱 Redis 發布訂閱可以用在像消息通知,群聊,定向推送,參數刷新加載等業務場景 發布訂閱模型有三個角色: 發布者(Publisher)訂閱者(Subscriber)頻道(channel) 每個訂閱者可以訂閱多個頻道&am…

nfs的快速部署

1、nfs內核自帶協議模塊不用安裝,如果沒有yum安裝yum -y install nfs-utils2、配置vim /etc/exports #配置文件 此文件一般為空,編寫格式為: /share/word 192.168.31.254(rw) 192.168.31.252(ro) # 共享/share/word目錄給192.168.…

redistemplate怎么修改數據_如何使用RedisTemplate訪問Redis數據結構?

在springboot項目中,集成各種框架變得非常容易。下面簡單介紹一下如何在springboot項目中集成單機模式redis。集群模式也差不多,這里就不過多介紹了。首先你得安裝redis服務,無論在linux還是windows系統上。如果沒有安裝,請自行百…

HyperLogLog原理與在Redis中的使用

Redis-HyperLogLog 基于HyperLogLog算法,使用極小的空間完成巨量運算 Redis 中HyperLogLog 基本使用 常用命令 PFADD key element [element …]: 將任意數量的元素添加到指定的 HyperLogLog 里面。PFCOUNT key [key …]: 計算hyperloglog的獨立總數prmerge destk…

iOS開發UI篇—xib的簡單使用

一、簡單介紹 xib和storyboard的比較,一個輕量級一個重量級。 共同點: 都用來描述軟件界面 都用Interface Builder工具來編輯 不同點: Xib是輕量級的,用來描述局部的UI界面 Storyboard是重量級的,用來描述整個軟件的多個界面&…

【云棲計算之旅】線下沙龍第2期精彩預告:Docker在云平臺上的最佳實踐

Docker是一個開源的應用容器引擎,提供了一種在安全、可重復的環境中自動部署軟件的方式,允許開發者將他們的應用和依賴包打包到一個可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化。容器完全使用沙箱機制&…

小程序mpvue圖片繪制水印_開發筆記:使用 mpvue 開發斗圖小程序

之前用過 wepy 框架寫了個小程序 GitHub - yshkk/shanbay-mina: 基于 wepy 框架的 “扇貝閱讀” 微信小程序 ,感覺寫法上類似 vue,但不那么徹底。現在美團點評發布的 mpvue 支持開發者可以用 vue 的語法開發微信小程序,正好有強需求需要一個斗…

mysql int類型的長度值

整數類型的存儲和范圍(來自mysql手冊) 類型字節最小值最大值(帶符號的/無符號的)(帶符號的/無符號的)TINYINT1-1281270255SMALLINT2-3276832767065535MEDIUMINT3-83886088388607016777215INT4-2147483648214748364704294967295BIGINT8-92233720368547758089223372036854775807…

龍王我當定了(一個在QQ刷龍王的腳本)

自從學了python,龍王再也沒丟過,就是經常被打, QQ 和 TIM 都可以,發送時要把聊天窗口打開。 # 如果import報錯,那可以pip下載這幾個模塊試一試 import win32gui import win32con import win32clipboard as w import random from…

時序數據合并場景加速分析和實現 - 復合索引,窗口分組查詢加速,變態遞歸加速...

時序數據合并場景加速分析和實現 - 復合索引,窗口分組查詢加速,變態遞歸加速 作者 digoal 日期 2016-11-28 標簽 PostgreSQL , 數據合并 , 時序數據 , 復合索引 , 窗口查詢 背景 在很多場景中,都會有數據合并的需求。 例如記錄了表的變更明細…

navicat for mysql 數據庫備份與還原

一, 首先設置, 備份保存路徑 工具 -> 選項 點開 其他 -> 日志文件保存路徑 二. 開始備份 備份分兩種, 一種是以sql保存, 一種是保存為備份 SQL保存 右鍵點擊你要備份的數據庫, -> 轉儲SQL文件 選擇位置和文件名 開始轉儲 導入 建議 刪除所有表 或 重新建數據庫 同導出…

DES的原理及python實現

DES加密算法原理及實現 DES是一種對稱加密算法【即發送者與接收者持有相同的密鑰】,它的基本原理是將要加密的數據劃分為n個64位的塊,然后使用一個56位的密鑰逐個加密每一個64位的塊,得到n個64位的密文塊,最后將密文塊拼接起來得…

python按身高體重排隊_LeetCode-python 406.根據身高重建隊列

題目鏈接難度:中等 類型: 數組假設有打亂順序的一群人站成一個隊列。 每個人由一個整數對(h, k)表示,其中h是這個人的身高,k是排在這個人前面且身高大于或等于h的人數。 編寫一個算法來重建這個隊列。注意:總人數…

遠程連接mysql數據庫,1130問題

遠程或使用非127.0.0.1和localhost地址連接時,出現代號為1130問題, ERROR 1130: Host 192.168.2.159 is not allowed to connect to this MySQL server 猜想這是沒有授權,將mysql數據庫中user表中host列的localhost改為%,重新啟動…

華為手機充滿有提醒嗎_2020手機充電速度排名:最快21分鐘充滿,華為第15名

5G手機扎堆出現,中國5G基站數量也是不斷增多,中國移動曾經表態,2020年底將會在全國地級市覆蓋5G網絡,全民5G時代終于到來!從目前國內手機出貨量數據來看,5G手機占比已經達到了六成以上,國產5G手…

關于移動手機端富文本編輯器qeditor圖片上傳改造

日前項目需要在移動端增加富文本編輯,上網找了下,大多數都是針對pc版的,不太兼容手機,當然由于手機屏幕小等原因也限制富文本編輯器的眾多強大功能,所以要找的編輯器功能必須是精簡的。 找了好久,發現qedit…

【python】生成器

生成器 直接總結 創建生成器的方法 生成器表達式:(i for i in [1, 2])yield: 函數中出現yield這個函數就是生成器,函數(生成器)執行到yield時會返回yield后面的值,并暫停,知道下次被喚醒后會從暫停處接著…

python redis 性能測試臺_Redis性能測試

Redis 性能測試Redis 性能測試是通過同時執行多個命令實現的。Redis性能測試主要是通過src文件夾下的redis-benchmark來實現(Linux系統下)語法redis 性能測試的基本命令如下:redis-benchmark [option] [option value]實例以下實例同時執行 10000 個請求來檢測性能&a…

Java IO 系統

Java IO系統 File類 用來處理文件目錄,既可以代表一個特定文件的名稱,也可以代表一組文件的名稱,如果代表的是一個文件組,可以調用File.list()方法返回一個字符數組。 list()不傳遞任何參數時返回該目錄下所有文件或文件名的字…

Linux Crontab 任務管理工具命令以及示例

Crontab 是 Linux 平臺下的一款用于循環執行例行任務的工具,Linux 系統由 cron (crond) 這個系統服務來控制任務 , Linux系統本來就有很多的計劃任務需要啟動 , 所以這個系統服務是默認開機啟動的 。 Linux 為使用者提供的計劃任務的命令就是 Crontab Crontab 是 Linux 下用來周…