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

目标:目标文件为一个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模型下的波场快照):

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

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

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

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

(0)

相关推荐

  • python顺序的读取文件夹下名称有序的文件方法

    如下所示: import os path="/home/test/" #待读取的文件夹 path_list=os.listdir(path) path_list.sort() #对读取的路径进行排序 for filename in path_list: print(os.path.join(path,filename)) 以上这篇python顺序的读取文件夹下名称有序的文件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python 读取文件并替换字段的实例

    如下所示: fp = open(''test2.txt','w') #打开你要写得文件test2.txt lines = open('test1.txt').readlines() #打开文件,读入每一行 for s in lines: fp.write( s.replace('love','hate').replace('yes','no')) # replace是替换,write是写入 fp.close() # 关闭文件 import os import re f_path = r'c:\a

  • python跳过第一行快速读取文件内容的实例

    Python编程时,经常需要跳过第一行读取文件内容.简单的做法是为每行设置一个line_num,然后判断line_num是否为1,如果不等于1,则进行读取操作. 相应的Python代码如下: input_file = open("C:\\Python34\\test.csv") line_num = 0 for line in input_file: line_num += 1 if (line_num != 1): do_readline() 然而这样每次迭代都需要判断一次,增加了时

  • python 读取目录下csv文件并绘制曲线v111的方法

    实例如下: # -*- coding: utf-8 -*- """ Spyder Editor This temporary script file is located here: C:\Users\user\.spyder2\.temp.py """ """ Show how to modify the coordinate formatter to report the image "z"

  • python3读取excel文件只提取某些行某些列的值方法

    今天有一位同学给了我一个excel文件,要求读取某些行,某些列,然后我试着做了一个demo,这里分享出来,希望能帮到大家: 首先安装xlrd: pip3 install xlrd 然后上代码: import numpy as np import xlrd data = xlrd.open_workbook('LifeTable_16.xlsx') table = data.sheets()[0] # print(table) # nrows = table.nrows #行数 # ncols =

  • Python读取mat文件,并转为csv文件的实例

    初学Python,遇到需要将mat文件转为csv文件,看了很多博客,最后找到了解决办法,代码如下: #方法1 from pandas import Series,DataFrame import pandas as pd import numpy as np import h5py datapath = 'E:/workspacelxr/contem/data.mat' file = h5py.File(datapath,'r') file.keys() def Print(name):prin

  • python之文件读取一行一行的方法

    如下所示: f=file('a.txt') for eachline in f: print eachline 以上这篇python之文件读取一行一行的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python 读取文本文件的行数据,文件.splitlines()的方法

    一般跟踪训练的ground_truth的数据保存在文本文文件中,故每一行的数据为一张图片的标签数据,这个时候读取每一张图片的标签,具体实现如下: test_txt = '/home/zcm/tensorf/siamfc-tf-master/data/Biker/groundtruth.txt' def load_label_set(label_dir): label_folder = open(label_dir, "r") trainlines = label_folder.read

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

    目标:目标文件为一个float32型存储的二进制文件,按列优先方式存储.本文使用Python读取该二进制文件并使用matplotlib.pyplot相关工具画出图像 工具:Python3, matplotlib,os,struct,numpy 1. 读取二进制文件 首先使用open函数打开文件,打开模式选择二进制读取"rb". f = open(filename, "rb") 第二步,需要打开按照行列读取文件,由于是纯二进制文件,内部不含邮任何的数据结构信息,因此我

  • Python文件和流(实例讲解)

    1.文件写入 #打开文件,路径不对会报错 f = open(r"C:\Users\jm\Desktop\pyfile.txt","w") f.write("Hello,world!\n") f.close() 2.文件读取 #读取 f = open(r"C:\Users\jm\Desktop\pyfile.txt","r") print(f.read()) f.close() 输出: Hello,world

  • python用户管理系统的实例讲解

    学Python这么久了,第一次写一个这么多的代码(我承认只有300多行,重复的代码挺多的,我承认我确实垃圾),但是也挺不容易的 自定义函数+装饰器,每一个模块写的一个函数 很多地方能用装饰器(逻辑跟不上,有的地方没用),包括双层装饰器(不会),很多地方需要优化,重复代码太多 我还是把我的流程图拿出来吧,虽然看着比上次的垃圾,但是我也做了一个小时,不容易! 好像是挺丑的(表示不会画,但我下次一定努力) 用户文件: 文件名为:user.txt 1代表管理员用户 2代表普通用户 smelond|adm

  • 在Windows中设置Python环境变量的实例讲解

    在 Windows 设置环境变量 在环境变量中添加Python目录: 在命令提示框中(cmd) : 输入 path=%path%;C:\Python 按下"Enter". 注意: C:\Python 是Python的安装目录. 也可以通过以下方式设置: • 右键点击"计算机",然后点击"属性" • 然后点击"高级系统设置" • 选择"系统变量"窗口下面的"Path",双击即可! • 然后

  • 使用Rasterio读取栅格数据的实例讲解

    Rasterio简介 有没有觉得用GDAL的Python绑定书写的代码很不Pythonic,强迫症的你可能有些忍受不了.不过,没关系,MapBox旗下的开源库Rasterio帮我们解决了这个痛点. Rasterio是基于GDAL库二次封装的更加符合Python风格的主要用于空间栅格数据处理的Python库. Rasterio中栅格数据模型基本和GDAL类似,需要注意的是: 在Rasterio 1.0以后,对于GeoTransform的表示弃用了GDAL风格的放射变换,而使用了Python放射变换

  • python爬虫筛选工作实例讲解

    我们在选择一件商品的时候,会先了解一些相关的商品信息,根据自己的需求和情况再进行选择.这种现象也同样适用于找工作,筛选一个岗位的重要环节,就是看自身是否符合工作经验的要求.不过因为信息量比较大,有没有什么方法可以用python爬虫中的知识点帮我们解决一下呢~具体内容往下看: 根据工作经验年限,划分招聘等级 # 校正拉勾网工作年限描述,以 Boss直聘描述为准 def update_lagou_workyear(): items = db.jobs_lagou_php.find({}) for i

  • python之tensorflow手把手实例讲解猫狗识别实现

    目录 一,猫狗数据集数目构成 二,数据导入 三,数据集构建 四,模型搭建 五,模型训练 六,模型测试 作为tensorflow初学的大三学生,本次课程作业的使用猫狗数据集做一个二分类模型. 一,猫狗数据集数目构成 train cats:1000 ,dogs:1000 test cats: 500,dogs:500 validation cats:500,dogs:500 二,数据导入 train_dir = 'Data/train' test_dir = 'Data/test' validati

  • python之tensorflow手把手实例讲解斑马线识别实现

    一,斑马线的数据集 数据集的构成: test train zebra corssing:56 zebra corssing:168 other:54 other:164 二,代码部分 1.导包 import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator import numpy as np import matplotlib.pyplot as plt import ker

  • Python 模拟购物车的实例讲解

    1.功能简介 此程序模拟用户登陆商城后购买商品操作.可实现用户登陆.商品购买.历史消费记查询.余额和消费信息更新等功能.首次登陆输入初始账户资金,后续登陆则从文件获取上次消费后的余额,每次购买商品后会扣除相应金额并更新余额信息,退出时也会将余额和消费记录更新到文件以备后续查询. 2.实现方法 架构: 本程序采用python语言编写,将各项任务进行分解并定义对应的函数来处理,从而使程序结构清晰明了.主要编写了六个函数: (1)login(name,password) 用户登陆函数,实现用户名和密码

  • python读取二进制mnist实例详解

    python读取二进制mnist实例详解 training data 数据结构: <br>[offset] [type] [value] [description] 0000 32 bit integer 0x00000803(2051) magic number 0004 32 bit integer 60000 number of images 0008 32 bit integer 28 number of rows 0012 32 bit integer 28 number of co

随机推荐