python存取數據進階技巧-pickle,array模塊


我們在存/取數據時,沒有必要存成文本形式,多試試二進制形式,文本只是騙騙眼睛的,要更快和更高效

1.數組形式

如果我們需要一個之包含數字的列表,那就試試array.array,注意,不是numpy模塊下的,他是自己獨立的模塊,支持同樣的pop,insert,extend操作,同時還支持從文件存/取文件更快的方法.

#!/usr/bin/python
# coding=utf-8
# __author__='dahu'
# data=2017-
# 創建1000萬個浮點數,存取文件,速度相當快
# 這里的array不是numpy下面的,他是獨立的
from array import array  # 導入array類型
from random import random
import time
floats = array('d', (random() for i in range(2)))
print type(floats)
print time.ctime()
floats = array('d', (random() for i in range(10 ** 7)))  # 建立爽精度浮點數組,類型碼'd',生成器表達式生成
print 'End value -> ',floats[-1]
with open('f1', 'wb') as f:
    floats.tofile(f)  # 數組存入二進制文件里
floats2 = array('d')
with open('f1', 'rb') as f:
    floats2.fromfile(f, 10 ** 7)  # 讀取
print 'End value -> ',floats2[-1]
print floats == floats2
print time.ctime()

結果:

/usr/bin/python2.7 /home/dahu/json_folder/descripter_exercise/bisect.lianxi/array.test.py
<type 'array.array'>
Thu Jun 15 15:45:52 2017
End value ->  0.85158039292
End value ->  0.85158039292
True
Thu Jun 15 15:45:54 2017

Process finished with exit code 0

2.python的pickle模塊實現了基本的數據序列和反序列化。通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲;通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。

注意這里使用的pprint模塊,可以打印數據結構

write

#!/usr/bin/python
#coding=utf-8
#__author__='dahu'
#data=2017-
# 
import pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
# selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

read

#!/usr/bin/python
#coding=utf-8
#__author__='dahu'
#data=2017-
# 
import pprint, pickle

pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()
pprint.pprint(range(5))

結果:

/usr/bin/python2.7 /home/dahu/json_folder/descripter_exercise/bisect.lianxi/pickle..test.read.py
{'a': [1, 2.0, 3, (4+6j)], 'b': ('string', u'Unicode string'), 'c': None}
[1, 2, 3]
[0, 1, 2, 3, 4]

Process finished with exit code 0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM