翼度科技»论坛 编程开发 python 查看内容

python使用numpy按一定格式读取bin文件的实现

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
使用numpy按一定格式读取bin文件

python环境下,如何使用numpy像matlab一样按一定格式读取bin文件?
bin文件就是将数据按16进制形式存储的二进制文件(binary),可以使用WINHEX、Notepad++(需安装插件)等以16进制形式打开,如图用notepad++打开。

由于使用python中的read()读取二进制文件时是以字符串形式读取,且每次只能读取一个字节,十分不方便。
偶然发现可以使用numpy中的fromfile按指定格式对bin文件进行读写,方便了许多。
NumPy提供了多种存取数组内容的文件操作函数。
保存数组数据的文件可以是二进制格式或者文本格式。
二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型。

    1. tofile()
    复制代码
    将数组中的数据以二进制格式写进文件
    1. tofile()
    复制代码
    输出的数据不保存数组形状和元素类型等信息
    1. fromfile()
    复制代码
    函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改

这里重点介绍fromfile
  1. numpy.fromfile(file, dtype=float, count=-1, sep='', offset=0, *, like=None) 
复制代码

    1. file
    复制代码
    是待读取内容,可以是文件、路径、字符串
    1. dtype
    复制代码
    返回数组的数据类型。对于二进制文件,它用于确定文件中项目的大小和字节顺序。支持大多数内置数字类型,也支持扩展类型。1.18.0开始支持复数格式
    1. count
    复制代码
    :要读取的项目数量(不一定以字节为单位),count = -1表示读取所有项目(即完整文件)
    1. sep
    复制代码
    :项目之间的分隔符(如果文件是文本文件)。空(“”)分隔符表示文件应被视为二进制文件。分隔符中的空格(“”)与零个或多个空格字符匹配。仅由空格组成的分隔符必须至少匹配一个空格
    1. offset
    复制代码
    :距文件当前位置的偏移量(以字节为单位)。默认为0。仅允许用于二进制文件。可以和count搭配用于读取指定位置和长度的内容
    1. like
    复制代码
    :引用对象以允许创建非NumPy数组的数组,如果传入一个像like一样支持  
    1. __array_function__
    复制代码
    协议的数组形式,结果将由它来定义。在这种情况下,它确保创建与通过此参数传入的对象兼容的数组对象。
  1. import numpy as np
  2. a = np.arange(24)
  3. b = np.fromfile("F:/a.bin", dtype=np.int32, count=5, offset=8)
  4. print(a, '\n', b)
复制代码

由上图可以看出,数据是以32位的十六进制数形式存储,也就是一个数占4个字节。(tofile写入数据的顺序为 ‘C’ order)。
此时,若设置count=5, offset=8,也就是从0开始偏移8个字节,读取5个数
结果如图:




python读取bin文件并下发串口
  1. # coding:utf-8
  2. import time, serial
  3. from struct import *
  4. import binascii
  5. file = open('E:\\1.bin', 'rb')
  6. i = 0
  7. while 1:
  8.     c = file.read(1)
  9.     # 将字节转换成16进制;
  10.     ssss = str(binascii.b2a_hex(c))[2:-1]
  11.     print(str(binascii.b2a_hex(c))[2:-1])
  12.     if not c:
  13.         break
  14.     ser = serial.Serial('COM3', 57600, timeout=1)
  15.     ser.write(bytes().fromhex(ssss))# 将16进制转换为字节
  16.     if i % 16 == 0:
  17.         time.sleep(0.001)
  18.     #写每一行等待的时间
  19.     i += 1
  20.     ser.close()
  21. file.close()
复制代码
总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

来源:https://www.jb51.net/article/283859.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具