使用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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
python字符串替换示例
Apr 24 Python
在Python中使用Neo4j数据库的教程
Apr 16 Python
Python中time模块和datetime模块的用法示例
Feb 28 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
使用python 写一个静态服务(实战)
Jun 28 Python
python同时遍历两个list用法说明
May 02 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
Ubuntu20下的Django安装的方法步骤
Jan 24 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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中读取照片exif信息的方法
2014/08/20 PHP
smarty实现多级分类的方法
2014/12/05 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
JScript中的"this"关键字使用方式补充材料
2007/03/08 Javascript
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
jquery 学习笔记一
2010/04/07 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
2016/05/24 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
深入解析Python中的__builtins__内建对象
2016/06/21 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
.NET初级开发工程师面试题
2014/04/18 面试题
本科生个人求职自荐信
2013/09/26 职场文书
建筑工程专业毕业生自荐信
2013/10/19 职场文书
食堂个人先进事迹
2014/01/22 职场文书
2014年酒店工作总结与计划
2014/11/17 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
员工手册编写范本
2015/05/14 职场文书
民事起诉状范文
2015/05/19 职场文书
企业文化学习心得体会
2016/01/21 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis