使用Python读取二进制文件

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

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

1. 读取二进制文件

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

f = open(filename, "rb")

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

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

        得到的结果如下:

  1. b'5\x9d\x82\xc3'
  2. b'\xb1\x04\x10\xc4'
  3. b'\xc1\x9eD\xc4'
  4. b'a\x86R\xc4'
  5. b'\x15\x01=\xc4'

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

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

就可以得到正确的结果了

  1. -261.2281799316406
  2. -576.0733032226562
  3. -786.4805297851562
  4. -842.0996704101562
  5. -756.0169067382812

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

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

  1. def xshow(filename, nx, nz):
  2. f = open(filename, "rb")
  3. pic = np.zeros((nx, nz))
  4. for i in range(nx):
  5. for j in range(nz):
  6. data = f.read(4)
  7. elem = struct.unpack("f", data)[0]
  8. pic[i][j] = elem
  9. f.close()
  10. return pic

    2. 画出图像

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

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

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

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

(0)

相关推荐

  • CTF 一次PWN解题的小技巧

    前几天在国外的某个ctf社区发现了一道好玩的赛题. 建议ctfer在阅读这篇文章的时候,首先要掌握以下的一些内容,因为这些东西对于ctf比赛来说,都是很有必要掌握的. 基本的Linux知识 对于X86 ...

  • 成功解决Python中出现的ValueError: not enough values to unpack (expected 2, got 1)的问题

    成功解决Python中出现的ValueError: not enough values to unpack (expected 2, got 1)的问题 解决问题 解决Python中出现的ValueE ...

  • Python中的文件处理–为初学者学习Python文件处理

    Python文件处理操作 Python文件处理操作(也称为Python I / O)处理两种类型的文件.他们是: 文字档 二进制文件 即使两种文件类型在表面上看起来相同,它们对数据的编码也不同. 文本 ...

  • python unpack

    小量最近用PySCF计算Hartree-Fock轨道传递给自己的程序使用,为了保证精度和节省硬盘空间,使用二进制文件来传递数据.本文简单小结一下Python的二进制文件的读写. 在Python中实现二 ...

  • python读取数据库PostgreSQL导出shapefile(shp)文件

    python读取数据库PostgreSQL导出shapefile(shp)文件

  • python读取pdf中的文本

    python处理pdf也是常用的技术了,对于python3来说,pdfminer3k是一个非常好的工具. pip install pdfminer3k 首先,为了满足大部分人的需求,我先给一个通用一点 ...

  • python读取mdb所有表

    时效说明:walker 的旧文迁移,某些地方可能过时,最后更新时间为 2015-09-25 以下所有代码 Python2.7.Python3.4 均可用. win32.com # encoding: ...

  • Python|读取word文档表格内容

    引言在日常生活里,不管是办公.学习还是制作邀请函.请柬.简历等等,我们都会使用一个软件Microsoft Office Word,Office Word是微软公司的一个收费文字处理应用程序,是最流行的 ...

  • python 读取并显示图片的两种方法

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

  • 使用Python读取图片中的文本数据

    CoolAuthor:Dario RadečićTitle: Read Text from Image with One Line of Python CodeSite https://towards ...

  • Python读取Excel文件的方法

    方法一:读excel文件单元格数据 import xlrd book = xlrd.open_workbook('fruit.xlsx') print('sheet页名称:',book.sheet_n ...

  • python读取caffemodel文件

    caffemodel是二进制的protobuf文件,利用protobuf的python接口可以读取它,解析出需要的内容 不少算法都是用预训练模型在自己数据上微调,即加载"caffemodel ...

  • python 读取多个excel数据写入同一个excel中

    一.将excel数据源存储到同一个excel的不同sheet 中 例如A.xlsx 中有test1,test2 两张sheet.B.xlsx中有test3 一张sheet,存储到C.xlsx中后,C有 ...