上一章节我们讨论了如何对txt文本文件进行读写操作,这一张将讨论如何进行二进制文件的写与读。《Python 学习笔记(3)对txt文件的读与写操作(上)》的链接如下https://blog.csdn.net/yanchuan23/article/details/121069465https://blog.csdn.net/yanchuan23/article/details/121069465https://blog.csdn.net/yanchuan23/article/details/121069465

1、uint32数据转换为4个字节

首先看下如何将uint32转换为4个字节。

# 计算一个无符号32位数据的bytes表达
temp = [0] * 4
uintdata = 123456
for i in range(4):temp[i] = hex((uintdata >> i * 8) & 0xff)

计算结果如下:

但是如果数据位浮点数这样就行不通了。

可以用struct来解决bytes和其他二进制数据类型的转换。

2、 struct模块

struct的作用:将字节串解读为打包的二进制数据。

该模块执行Python值和以Python字节对象表示的C结构体之间的转换。 这可以用于处理存储在文件中的二进制数据或来自其他来源的网络连接的二进制数据。 它使用格式字符串作为C结构布局的紧凑描述,以及与Python值的转换。

2.1、struct模块中的功能

函数

return

explain

pack(fmt,v1,v2…)

string

按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回.

pack_into(fmt,buffer,offset,v1,v2…)

None

按照给定的格式(fmt),将数据转换成字符串(字节流),并将字节流写入以offset开始的buffer中.(buffer为可写的缓冲区,可用array模块)

unpack(fmt,v1,v2…..)

tuple

按照给定的格式(fmt)解析字节流,并返回解析结果

pack_from(fmt,buffer,offset)

tuple

按照给定的格式(fmt)解析以offset开始的缓冲区,并返回解析结果

calcsize(fmt)

size of fmt

计算给定的格式(fmt)占用多少字节的内存,注意对齐方式

2.2、格式化字符串

当打包或者解包的时,需要按照特定的方式来打包或者解包。该方式就是格式化字符串,它指定了数据类型,除此之外,还有用于控制字节顺序、大小和对齐方式的特殊字符。

2.2.1、字节顺序、大小与对齐方式

为了同c中的结构体交换数据,还要考虑c或c++编译器使用了字节对齐,通常是以4个字节为单位,故而struct根据本地机器字节顺序转换。可以用格式中的第一个字符来改变对齐方式。定义如下

Character

Byte order (字节顺序大小)

Size

Alignment(对齐)

@(默认)

本机(native)

本机(native)

本机(native),凑够4个字节

=

本机(native)

标准(standard)

None,按原字节数

<

小端(little-endian)

标准(standard)

None,按原字节数

>

大端(big-endian)

标准(standard)

None,按原字节数

!

network(= big-endian大端)

标准(standard)

None,按原字节数

2.2.2、格式符

Format格式符

C Type(C语言类型)

Python type(Python语言类型)

Standard size

x

pad byte(填充字节)

no value

c

Char

bytes of length 1

1

b

signed char

integer

1

B

unsigned char

integer

1

?

_Bool

bool

1

h

Short

integer

2

H

unsigned short

integer

2

i

int

integer

4

I(大写的i)

unsigned int

integer

4

l(小写的L)

long

integer

4

L

unsigned long

integer

4

q

long long

integer

8

Q

unsigned long long

integer

8

n

ssize_t

integer

N

size_t

integer

e

(6)

float

2

f

float

float

4

d

double

float

8

s

char[]

bytes

p

char[]

bytes

P

void*

integer

2.3、例子

 # 将浮点数变为字符串f_data1 = 123.4567f_data1 = struct.pack('<f', f_data1)u_data1 = struct.unpack('<I', f_data1)f_data2 = -123.4567f_data2 = struct.pack('<f', f_data2)u_data2 = struct.unpack('<I', f_data1)

3、二进制文件读写

3.1、二进制文件写

好了,这下我们学会了如何将浮点数或者整形数据转换为bytes了,我们现在就看如何将浮点数或者整型数据存到二进制文本中。废话不多说,上代码:

"""二进制文件中的浮点数存储
"""FileName = 'w2.txt'# 以二进制的形式打开一个指定文件夹,如果没有就创建,如果有就将原来的内容覆盖fid = open(Folder + '/' + FileName, 'wb')s2 = 123.4567s3 = -123.4567# 使用pack函数,将f数据 以小子端的方式转换为bytesDataBytes = struct.pack('<f', s2)for i in range(4):fid.write(c_uint8(DataBytes[i]))  # 在write的时候还是转换和成c_uint8,不然会报错DataBytes = struct.pack('<f', s3)for i in range(4):fid.write(c_uint8(DataBytes[i]))fid.close()

最后生成了txt文件,如下所示,将显示改成hex的方式。

3.2、二进制文件读取

这个时候我们并不能认为结果是对的,我们可以用matlab读取验证或者用Python自己读取再将bytes数据转换为float。

3.2.1、Matlab读取二进制文件

Matlab的代码如下所示:

close all
clear
clcfid = fopen('w2.txt','r');
data1 = fread(fid,1,'float');
data2 = fread(fid,1,'float');

我们以float的方式读取,发现读取的结果为123.4567和-123.4567,和我们一开始的赋值一致,证明那个我们这么写是成功了的。

3.2.2、Python读取二进制文件

    FileName = 'w2.txt'# 以二进制的形式打开一个指定文件夹,如果没有就创建,如果有就将原来的内容覆盖fid = open(Folder + '/' + FileName, 'rb')DataBytes1 = fid.read(4)  # 这边读出来是 bytes# 将bytes解包为指定的数据类型S4 = struct.unpack('<f', DataBytes1)DataBytes1 = fid.read(4)  # 这边读出来是 bytes# 将bytes解包为指定的数据类型S5 = struct.unpack('<f', DataBytes1)fid.close()

4、写在最后

好了,关于Python如何读写 文本文件、二进制文件、将字符串写到txt文件中与将float或者int数据写到txt文件的方法大概就写到这,后面如果还遇到啥就继续补充吧。

文中对应的代码链接:

Project_File.rar-嵌入式文档类资源-CSDN文库https://download.csdn.net/download/yanchuan23/36135222

Python 学习笔记(3)对txt文件的读与写操作(下)相关推荐

  1. Python 学习笔记(3)对txt文件的读与写操作(上)

    目录 1.file 对象 2.open() 方法 3.txt文件的读与写 3.1.写txt文件 3.2.读txt文件 3.2.在文件末尾续写文件 4.写在最后 1.file 对象 file 对象使用 ...

  2. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  3. Python学习笔记之类型判断,异常处理,终止程序操作小结

    Python学习笔记之类型判断,异常处理,终止程序操作小结 运行结果: 这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发. 爬虫.数据分析.数据可视化.机 ...

  4. python学习笔记(九)——文件和异常(重点)

    学文件的目的:数据不能可能一直在内存中存储,持久化存储到磁盘就需要用到文件了! 一.文件和上下文管理器(重点) 1.打开文件-open() 方法 Python open() 方法用于打开一个文件,并返 ...

  5. Python学习笔记——glob模块【文件、路径操作】

    最近做了一个将dicom文件转化为mhd文件的任务,由于要进行批量转化所以遍历文件夹必不可少,刚开始学习python编程,所以把用过的模块用法记录下来,以加深记忆,方便查阅,最后参考前人的博客做了gl ...

  6. python学习笔记20(读取文件内容)

    1.一次性读取文件全部内容(读取的文件milktea和main.py在同一目录的情况) ''' 读取与main.py同一目录的文件milktea.txt文件里面的内容 利用open()函数打开文件,返 ...

  7. 【Python学习笔记(二)】使用Pyinstaller将不同路径下的py文件打包成exe可执行文件

    ** 使用Pyinstaller将不同路径下的py文件打包成exe可执行文件 ** ** 前言 在Windows环境下需要打包一个python项目成exe可执行文件,共有一个主函数BomSoftwar ...

  8. 如何读写txt文件 C++读和写txt文件操作 查找文件中存储的字符串中逗号的位置

    C++读和写文件操作说明 一. C++读和写文件操作说明 文章目录 C++读和写文件操作说明 一. C++读和写文件操作说明 1.打开方式 2.实例代码 2.1 第一版代码 2.2 第二版代码 二.补 ...

  9. python学习笔记(自定义库文件路径)

    博主最近在弄接口自动化.主要是基于python自带的unittest框架.包括 Pubilc模块定义所有接口. Main模块根据业务需求重新封装接口便于测试. config文件导入测试业务的固定参数. ...

最新文章

  1. TensorFlow 等“开源陷阱,会掐住中国 AI 企业的命门吗?
  2. 国内ntp服务器ip地址
  3. [RabbitMQ]RabbitMQ原理与相关操作(一)
  4. linux tmux 详细教程,Linux下的神器介绍之Tmux分屏器
  5. postman如何改成中文版_在 Windows 上如何用 Postman 重现 Dubbo 反序列化漏洞
  6. 调查VMware View Composer失败代码(2085204)
  7. Anaconda 国内镜像源整理
  8. adb概览及协议參考
  9. 工厂利用计算机实现温度调节属于,工厂利用计算机系统实现温度调节、阀门开关,该应用属于()。A.过程控制B.数据处理C.科学计算D.C...
  10. React [Umi] history(API) 路由监听
  11. 阶段3 1.Mybatis_11.Mybatis的缓存_5 缓存的概念
  12. hql语句关联查询(select new )
  13. 2.74-写出具有如下原型的函数的代码:
  14. MATLAB高维矩阵的求和、索引
  15. Android利用shape画虚线
  16. 汇编语言 大小比较 理解 ja jna jg jle
  17. yy安全中心官网首页登录html,YY安全中心
  18. VB打包时出现没有注册类,怎么解决,蟹蟹各位大神
  19. 求助!微信公众号页面部分手机加载后空白!
  20. 人脸图片数据集:Olivetti Faces、LFW、YouTube Faces、IMDB WIKI、FDDB

热门文章

  1. 【面试虐菜】—— JAVA面试题(3)
  2. UA OPTI570 量子力学17 创生算符与湮灭算符
  3. UA PHYS515 电磁理论I 麦克斯韦方程组基础4 介质中的麦克斯韦方程
  4. VC++ 使用TeeChart图表控件(1)
  5. SQL注入语法类型——报错注入
  6. [USACO5.3]校园网Network of Schools
  7. CI配置文件 --------- autoload.php
  8. GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合
  9. [LintCode] Wildcard Matching
  10. hdu 1150 Machine Schedule (经典二分匹配)