標籤:

python二進位文件的讀取

為什麼要討論二進位文件的讀取,因為我們處理的數據不一定就是語音和圖像。有時我們需要將普通數據保存讀取。這是推薦一個非常好的庫:pickle,它會直接把對象原封不動的保存(它會記錄數組的相關信息),在原封不動的讀取。

import picklena = np.array([[1,2,3],[4,5,6],[7,8,9],[11,12,13]]).astype(float32)nwith open(a.bin, wb) as config_f:n pickle.dump(a, config_f)n

這個就是保存一個數組【pickle.dump和pickle.dumps大家一定一定要注意

import picklenwith open(a.bin, rb) as f_in:n C = pickle.load(f_in)n

這是讀取一個數組,驚不驚喜!意不意外!太方便了!

這是一個很重要的分割線,下面是用tf進行的二進位文件的操作,有點麻煩。老實說,我特別不喜歡tf的二進位讀取,特別麻煩。

-----------------------------------------------------------------------------------------------


寫一個二進文件

import numpy as npna = np.array([1,2]).astype(np.float32)nwith open(a.bin, wb) as fp:n fp.write(a.tostring())n

得到二進位打開是這樣的

把a改為[1,2,3]

這證明我們成功的將一個二進位文件寫進去了

  1. a要是一個numpy數組
  2. open當文件不存的時候會自動創建
  3. tostring():存入的二進位一般是字元串類型
  4. 其會一行的一行的依次保存數據

import tensorflow as tfnnfiles = [a.bin]nnfilename_queue = tf.train.string_input_producer(files, num_epochs=1)nreader = tf.WholeFileReader()n_, value = reader.read(filename_queue)nvalue = tf.decode_raw(value, tf.float32)nnsv = tf.train.Supervisor()nwith sv.managed_session() as sess:n while True:n try:n features = sess.run(value)n print(features)n finally:n passn

二進位文件讀取

  1. tf.train.Supervisor():必須要用這個創建sess。用tf.Session()要啟動隊列什麼的,比較麻煩
  2. tf.decode_raw(value, tf.float32):要與你存儲時候的是一致的
  3. 讀取的時候,它不會保留你的形狀,只會依次讀取。比如形狀是(3,2)存儲,讀出來是(6,)
  4. tf.WholeFileReader():是直接將你給定的文件全部讀進來
  5. tf還有一種讀法:tf.FixedLengthRecordReader(record_bytes)

①當讀的文件的位元組長度小於給定的長度時,直接跳過該文件

②當文件的長度大於給定的位元組時,它只會從開始讀讀到指定的長度,其餘的它是不讀的。總得來說,它並沒有我們想的那麼智能

import numpy as npnimport librosanna = np.array([[1,2,3],[4,5,6],[7,8,9],[11,12,13]]).astype(float32)nc= np.array([[70,80,90]]).astype(float32)nnwith open(./etc_t/SF1/a.bin, wb) as fp:n fp.write(a.tostring())nnwith open(./etc_t/SF1/c.bin, wb) as fp:n fp.write(c.tostring())nnb = np.array([[10,20,30],[40,50,60]]).astype(float32)nwith open(./etc_t/TM3/b.bin, wb) as fp:n fp.write(b.tostring())n

我創建了a,b,c三個文件。我讀的固定長度是:2 * 3 * 4(4是一個位元組的長度)

import tensorflow as tfnbatch_size = 2nrecord_bytes = batch_size * 3 * 4nfiles_SF1 = tf.gfile.Glob(./etc_t/SF1/*.bin)nfiles_TM3 = tf.gfile.Glob(./etc_t/TM3/*.bin)nnfilename_queue = tf.train.string_input_producer(files_SF1)nreader = tf.FixedLengthRecordReader(record_bytes)n_, value = reader.read(filename_queue)nvalue = tf.decode_raw(value, tf.float32)nnfilename_queue2 = tf.train.string_input_producer(files_TM3)nreader = tf.FixedLengthRecordReader(record_bytes)n_, value2 = reader.read(filename_queue2)nvalue2 = tf.decode_raw(value2, tf.float32)nnsv = tf.train.Supervisor()nnwhile True:n with sv.managed_session() as sess:n v1R,v2R = sess.run([value,value2])n v1R = v1R.reshape(-1,3,1)n v2R = v2R.reshape(-1,3,1)n print(v1R)n print(v2R)n輸出:n[[[ 1.]n [ 2.]n [ 3.]]nn [[ 4.]n [ 5.]n [ 6.]]]n[[[ 10.]n [ 20.]n [ 30.]]nn [[ 40.]n [ 50.]n [ 60.]]]n會發現,c文件直接是被忽略的,而a文件只會讀取前6個數,即使它有12個數n

看來看去還是tf讀取二進位文件最方便

歡迎關注公眾號:huangxiaobai880

https://www.zhihu.com/video/935479478189232128
推薦閱讀:

Python:一篇文章掌握Numpy的基本用法
Numpy中Meshgrid函數介紹及2種應用場景
如何用python numpy產生一個正態分布隨機數的向量或者矩陣?
python numpy的樣本標準差怎麼寫?

TAG:Python | numpy |