使用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 相关文章推荐
如何利用Fabric自动化你的任务
Oct 20 Python
Python 模板引擎的注入问题分析
Jan 01 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
python时间序列按频率生成日期的方法
May 14 Python
用python求一重积分和二重积分的例子
Dec 06 Python
Python下利用BeautifulSoup解析HTML的实现
Jan 17 Python
Python configparser模块应用过程解析
Aug 14 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
pytorch 6 batch_train 批训练操作
May 28 Python
python读取mat文件生成h5文件的实现
Jul 15 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 cookies中删除的一般赋值方法
2011/05/07 PHP
10个实用的PHP代码片段
2011/09/02 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
python&MongoDB爬取图书馆借阅记录
2016/02/05 Python
Python用UUID库生成唯一ID的方法示例
2016/12/15 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python自动抢红包教程详解
2019/06/11 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
Python绘制组合图的示例
2020/09/18 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
数控个人求职信范文
2014/02/03 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
中学生操行评语大全
2014/04/24 职场文书
会计专业自荐书
2014/07/08 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
学校学期工作总结
2015/08/13 职场文书
python 调用js的四种方式
2021/04/11 Python
python 自动刷新网页的两种方法
2021/04/20 Python
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL