python如何读取⼆进制⽂件为图⽚_Python⼆进制⽂件读取并
python怎么读文件夹下的文件夹转换
Python⼆进制⽂件读取并转换
Python⼆进制⽂件读取并转换
标签(空格分隔): python
本⽂所⽤环境:
Python 3.6.5 |Anaconda custom (64-bit)|
引⾔
由于某些原因,需要⽤python读取⼆进制⽂件,这⾥主要⽤到struct包,⽽这个包⾥⾯的⽅法主要是unpack、pack、calcsize。详细介绍可以看:Python Struct 官⽅⽂档。这⾥主要讨论,python⼆进制转浮点数的操作。
python中⼀个float类型的数占4个字节。
⼆进制数据转float,可以⽤struct.unpack()来实现。
⼩⽂件读取
较⼩的⽂件,可以⼀次读取:
⾸先导⼊所需的包:
import numpy as np
import struct
例如:我需要读取⼀个名为filename,存放着形状为[100,1025]的浮点数的⽂件。可以采⽤以下办法
# 加载测试数据
f = open('filename','rb')
# 102500为⽂档中包含的数字个数,⽽⼀个浮点数占4个字节
data_raw = struct.unpack('f'*ad(4*102500))
f.close()
verify_data = np.asarray(verify_data_raw).reshape(-1,1025)
⼤⽂件处理⽅法
我需要处理的⽂件⼤⼩有38.1G,存放着[10000000,1025]⼤⼩的向量。
关于⼤⽂件的处理,我参考了这位博主的⽂章-强悍的 Python —— 读取⼤⽂件,前两种⽅法都会造成MemoryError。第三种不会,但是,这个⽅法不能很好的将⼆进制⽂件转换成浮点数。
所以我想到了另外⼀种办法:
通过Linux命令切割⽂件
通过split命令将38.1G的⽂件按照指定⼤⼩切割,
split -b 820000k -a 2 filename data_
上述代码的意思是,指定每块⼤⼩为820000k,-a 2代表2位数命名,‘data_’代表前缀是’data_’最终⽣成49个⽂件(字典序 aa – bw),前48个⽂件每个204800⾏ 最后⼀个⽂件 169600⾏820000 = 4_1025_204800/1024
通过python循环读取⽂件
⾸先构建词汇表:
voc = ['a','b','c','d','e','f','g','h','i','j','k','l',
'm','n','o','p','q','r','s','t','u','v','w','x',
'y','z']
voc_short = ['a','b','c','d','e','f','g','h','i','j','k','l',
'm','n','o','p','q','r','s','t','u','v']
为了⽅便读取,将49个⼆进制⽂件转换成numpy专⽤⼆进制格式*.npy
for i in voc:
data_name = 'data_a'+str(i)
f = open(data_name,'rb')
data_raw = struct.unpack('f'*ad(4*209920000))
f.close()
data = np.asarray(data_raw).reshape(-1,1025)
np.save(data_name+'.npy',data) # 保存data_a*.npy⽂件
for i in voc_short:
data_name = 'data_b'+str(i)
f = open(data_name,'rb')
data_raw = struct.unpack('f'*ad(4*209920000))
f.close()
data = np.asarray(data_raw).reshape(-1,1025)
np.save(data_name+'.npy',data) # 保存data_b*.npy⽂件
data_name = 'data_bw'
f = open(data_name,'rb')
data_raw = struct.unpack('f'*ad(4*173840000))
np.save(data_name+'.npy',data_raw) # 保存data_bw.npy⽂件

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。