Python二进制文件读取并转换为浮点数详解


Posted in Python onJune 25, 2019

本文所用环境:

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
Python

例如:我需要读取一个名为filename,存放着形状为[100,1025]的浮点数的文件。可以采用以下办法

# 加载测试数据
f = open('filename','rb')
# 102500为文档中包含的数字个数,而一个浮点数占4个字节
data_raw = struct.unpack('f'*102500,f.read(4*102500))
f.close()
verify_data = np.asarray(verify_data_raw).reshape(-1,1025)

大文件处理方法

我需要处理的文件大小有38.1G,存放着[10000000,1025]大小的向量。

Python二进制文件读取并转换为浮点数详解

关于大文件的处理,我参考了这文章,但是,这个方法不能很好的将二进制文件转换成浮点数。

所以我想到了另外一种办法:

通过Linux命令切割文件

通过split命令将38.1G的文件按照指定大小切割,

split -b 820000k -a 2 filename data_

上述代码的意思是,指定每块大小为820000k,-a 2代表2位数命名,‘data_'代表前缀是'data_'

最终生成49个文件(字典序 aa ? bw),前48个文件每个204800行 最后一个文件 169600行

Python二进制文件读取并转换为浮点数详解

通过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'*209920000,f.read(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'*209920000,f.read(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'*173840000,f.read(4*173840000))
np.save(data_name+'.npy',data_raw) # 保存data_bw.npy文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中cPickle用法例子分享
Jan 03 Python
在Python的Django框架中调用方法和处理无效变量
Jul 15 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
python 不以科学计数法输出的方法
Jul 16 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
python实现串口自动触发工作的示例
Jul 02 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
如何基于python把文字图片写入word文档
Jul 31 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
pandas取dataframe特定行列的实现方法
May 24 Python
python print出共轭复数的方法详解
Jun 25 #Python
python安装pil库方法及代码
Jun 25 #Python
Python处理时间日期坐标轴过程详解
Jun 25 #Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 #Python
python求最大值最小值方法总结
Jun 25 #Python
python安装requests库的实例代码
Jun 25 #Python
Python登录系统界面实现详解
Jun 25 #Python
You might like
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
php牛逼的面试题分享
2013/01/18 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
分享PHP header函数使用教程
2013/09/05 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
tensorflow更改变量的值实例
2018/07/30 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
python实现一个猜拳游戏
2020/04/05 Python
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
综合素质的自我鉴定
2013/10/07 职场文书
小学生暑假感言
2014/02/06 职场文书
党员干部承诺书
2014/03/25 职场文书
企业安全生产承诺书
2014/05/22 职场文书
2014年纪检工作总结
2014/11/12 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
任命通知范文
2015/04/21 职场文书
中学教师教学工作总结
2015/08/13 职场文书
2016元旦主持人开场白
2015/12/03 职场文书