使用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中处理XML的教程
Apr 29 Python
python直接访问私有属性的简单方法
Jul 25 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
Python格式化输出%s和%d
May 07 Python
python实现各种插值法(数值分析)
Jul 30 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
Oct 31 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
Jan 05 Python
python实现杨辉三角的几种方法代码实例
Mar 02 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具体实现代码
2010/10/12 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
javascript call方法使用说明
2010/01/11 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
JavaScript设计模式之抽象工厂模式介绍
2014/12/28 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
JS实现去除数组中重复json的方法示例
2017/12/21 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
python 实现A*算法的示例代码
2018/08/13 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
python实现logistic分类算法代码
2020/02/28 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
存储过程的优点有哪些
2012/09/27 面试题
2014年管理人员工作总结
2014/12/01 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书