使用Python读取二进制文件的实例讲解


Posted in Python onJuly 09, 2018

目标:目标文件为一个float32型存储的二进制文件,按列优先方式存储。本文使用Python读取该二进制文件并使用matplotlib.pyplot相关工具画出图像

工具:Python3, matplotlib,os,struct,numpy

1. 读取二进制文件

首先使用open函数打开文件,打开模式选择二进制读取"rb"。

f = open(filename, "rb")

第二步,需要打开按照行列读取文件,由于是纯二进制文件,内部不含邮任何的数据结构信息,因此我们需要给定二进制数据的行数列数(nx和ny)来确定图像的形状。这里我们的数据类型是float32型的,对应过来是4bytes,使用for循环逐个read4个字节。

for i in range(nx):
 for j in range(ny):
  data = f.read(4)

得到的结果如下:

b'5\x9d\x82\xc3'
b'\xb1\x04\x10\xc4'
b'\xc1\x9eD\xc4'
b'a\x86R\xc4'
b'\x15\x01=\xc4'

可以看到,读入的数据为十六进制数,这个时候的数据并不能直接用来画图,需要转换为float32型。这里使用struct.unpack来转译

data_float = struct.unpack("f", data)[0]

就可以得到正确的结果了

-261.2281799316406
-576.0733032226562
-786.4805297851562
-842.0996704101562
-756.0169067382812

建立一个numpy数组,将读入的数据分别按列优先的方式放入数组,就完成了图像读入的操作。

将上述操作包装成函数,代码如下:

def xshow(filename, nx, nz):
 f = open(filename, "rb")
 pic = np.zeros((nx, nz))
 for i in range(nx):
  for j in range(nz):
   data = f.read(4)
   elem = struct.unpack("f", data)[0]
   pic[i][j] = elem
 f.close()
 return pic

2. 画出图像

这里我们的目的是将矩阵输出灰度图,并保存为tiff格式的图像,效果图如下(该图为使用弹性波波动方程在Marmousi模型下的波场快照):

使用Python读取二进制文件的实例讲解

不需要坐标轴的信息,直接使用imsave命令,使用cmap选定颜色格式即可。

plt.imsave('output.tiff', img, format='tiff', cmap=plt.cm.gray)

如果使用PIL库读取图像,可能会得到不同的效果,可能需要做直方图均衡,目前还没有找到原因。

使用Python读取二进制文件的实例讲解

以上这篇使用Python读取二进制文件的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python抓取网页图片并放到指定文件夹
Apr 24 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
Python编程flask使用页面模版的方法
Dec 28 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
Apr 29 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
python flask搭建web应用教程
Nov 19 Python
Python:slice与indices的用法
Nov 25 Python
pytorch 归一化与反归一化实例
Dec 31 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
深度学习详解之初试机器学习
Apr 14 Python
Python实现随机漫步功能
Jul 09 #Python
Python2包含中文报错的解决方法
Jul 09 #Python
对numpy数据写入文件的方法讲解
Jul 09 #Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 #Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 #Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 #Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 #Python
You might like
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
JavaScript修改css样式style
2008/04/15 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
js计算精度问题小结
2013/04/22 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
Vue实现验证码功能
2019/12/03 Javascript
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
Python内置加密模块用法解析
2019/11/25 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
介绍一下Mysql的存储引擎
2015/02/12 面试题
优秀教师的感人事迹
2014/02/04 职场文书
数控专业毕业生自荐信范文
2014/03/04 职场文书
成绩报告单家长评语
2014/12/30 职场文书
2015政治思想表现评语
2015/03/25 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server