前言

最近使用Python解析IDX文件格式的MNIST数据集,需要对二进制文件进行读取操作,其中我使用的是struct模块。查了网上挺多教程都写的挺好的,不过对新手不是很友好,所以我重新整理了一些笔记以供快速上手。

注:教程中以下四个名词同义:二进制流、二进制数组、字节流、字节数组

快速上手

在struct模块中,将一个整型数字、浮点型数字或字符流(字符数组)转换为字节流(字节数组)时,需要使用格式化字符串fmt告诉struct模块被转换的对象是什么类型,比如整型数字是'i',浮点型数字是'f',一个ascii码字符是's'。

def demo1():

# 使用bin_buf = struct.pack(fmt, buf)将buf为二进制数组bin_buf

# 使用buf = struct.unpack(fmt, bin_buf)将bin_buf二进制数组反转换回buf

# 整型数 -> 二进制流

buf1 = 256

bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'

ret1 = struct.unpack('i', bin_buf1)

print bin_buf1, ' <====> ', ret1

# 浮点数 -> 二进制流

buf2 = 3.1415

bin_buf2 = struct.pack('d', buf2) # 'd'代表'double'

ret2 = struct.unpack('d', bin_buf2)

print bin_buf2, ' <====> ', ret2

# 字符串 -> 二进制流

buf3 = 'Hello World'

bin_buf3 = struct.pack('11s', buf3) # '11s'代表长度为11的'string'字符数组

ret3 = struct.unpack('11s', bin_buf3)

print bin_buf3, ' <====> ', ret3

# 结构体 -> 二进制流

# 假设有一个结构体

# struct header {

# int buf1;

# double buf2;

# char buf3[11];

# }

bin_buf_all = struct.pack('id11s', buf1, buf2, buf3)

ret_all = struct.unpack('id11s', bin_buf_all)

print bin_buf_all, ' <====> ', ret_all

输出结果如下:

demo1输出结果

详解struct模块

主要函数

struct模块中最重要的三个函数是pack() , unpack() , calcsize()

# 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)

string = struct.pack(fmt, v1, v2, ...)

# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple

tuple = unpack(fmt, string)

# 计算给定的格式(fmt)占用多少字节的内存

offset = calcsize(fmt)

struct中的格式化字符串

struct中支持的格式如下表:

Format

C Type

Python

字节数

x

pad byte

no value

1

c

char

string 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

unsigned int

integer or lon

4

l

long

integer

4

L

unsigned long

long

4

q

long long

long

8

Q

unsigned long long

long

8

f

float

float

4

d

double

float

8

s

char[]

string

1

p

char[]

string

1

P

void *

long

注1:q和Q只在机器支持64位操作时有意思

注2:每个格式前可以有一个数字,表示个数

注3:s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串

注4:P用来转换一个指针,其长度和机器字长相关

注5:最后一个可以用来表示指针类型的,占4个字节

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

Character

Byte order

Size and alignment

@

native

native 凑够4个字节

=

native

standard 按原字节数

<

little-endian

standard 按原字节数

>

big-endian

standard 按原字节数

!

network (= big-endian)

standard 按原字节数

使用方法是放在fmt的第一个位置,就像'@5s6sif'

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助如果有疑问大家可以留言交流。

python把文件读成字节流_Python中struct模块对字节流/二进制流的操作教程相关推荐

  1. python把文件读成字节流_Python中对字节流/二进制流的操作:struct

    前言 前段时间使用Python解析IDX文件格式的MNIST数据集,需要对二进制文件进行读取操作,其中我使用的是struct模块.查了网上挺多教程都写的挺好的,不过对新手不是很友好,所以我重新整理了一 ...

  2. python 二进制流_Python中对字节流/二进制流的操作:struct模块简易使用教程

    前言 前段时间使用Python解析IDX文件格式的MNIST数据集,需要对二进制文件进行读取操作,其中我使用的是struct模块.查了网上挺多教程都写的挺好的,不过对新手不是很友好,所以我重新整理了一 ...

  3. python复制文件的方法是_Python中复制文件的9种方法

    Python 中有许多"开盖即食"的模块(比如 os,subprocess 和 shutil)以支持文件 I/O 操作.在这篇文章中,你将会看到一些用 Python 实现文件复制的 ...

  4. python中sys模块有问题_python中sys模块之输入输出错误流

    import sys sys.stdout.write("msg")   # 控制台白色字体打印 普通输出流 sys.stderr.write("msg") # ...

  5. python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  6. python csv模块 一次读多行_python中csv模块读取reader只能读取一次

    各位好,请问python读取csv文件时只能读取一次是为什么 现在有一个csv文件 大概是这个样子 现在对ID和length进行读取 import csv with open('ccc.csv','r ...

  7. python excel文件转换成字符串_python利用pandas将excel文件转换为txt文件的方法

    python将数据换为txt的方法有很多,可以用xlrd库实现.本人比较懒,不想按太多用的少的插件,利用已有库pandas将excel文件转换为txt文件. 直接上代码: ''' function:将 ...

  8. python 当前文件路径获取方式_python中获取文件路径的几种方式

    # 如果执行文件为E:\aa\bb\aa.py 1.获取当前路径 current_path11 = os.path.abspath(__file__) current_path12 = os.path ...

  9. python矩阵所有元素取整_Python中如何对一个数值进行取整操作呢?

    摘要: 下文讲述Python中数值取整的方法分享,如下所示: 数值取整是我们处理数据常用的方法, 那么Python如何对数据进行取整操作呢? 下文将一一道来,如下所示: 实现思路: 方式1: math ...

最新文章

  1. Open-E DSS V7 应用系列之六 构建软件iSCSI
  2. list 去重_测试面试题集Python列表去重
  3. 视频编解码学习笔记(一)
  4. ssm项目整合log4j日志
  5. php上传文件 服务器内部错误,php – 在将图像上传到S3时遇到内部服务器错误500...
  6. e2140服务器性能,4000 还是E2140?两大人气CPU对决
  7. ajax第一个例子,第一个ajax例子【ajax有哪几种啊,了解的指导哈】
  8. Linux下 JNI的使用
  9. (CVPR2019)图像语义分割(22) FickleNet-使用随机推理的用于弱监督和半监督的图像语义分割
  10. js基础知识汇总12
  11. Thinkphp学习笔记——友情链接的添加和验证
  12. 单片机 74HC573
  13. 黑程序员黑的最好的段子是什么?
  14. Vue CLI3 bable兼容ie11ie10
  15. 名帖107 俞和 小楷临《乐毅论》
  16. 基于javaee的养老保险管理系统
  17. 布雷默曼极限 (Bremermann‘s limit)
  18. 浅谈C++中的多线程(一)
  19. eclipse导入工程报错Faceted Project Problem(1 item)
  20. python 文件缓存

热门文章

  1. java 生产者消费者同步_经典线程同步问题(生产者消费者)--Java实现
  2. windows怎么用gpu跑python程序_在GPU(windows)上运行Theano的命令
  3. macbook历代_苹果MacBook Pro为什么越来越贵?历代回顾与新MBP简评
  4. 公众号后台接管技术支持_哪些技术有望接管开源?
  5. (50)Vue Router插件介绍
  6. 使用jquery版本的viewer.js图片更新的问题
  7. 小小在线教授何为BTC跳矿(教授如何在线扩大收益)
  8. es6 WeakMap
  9. 位置模拟服务器超时,调用别人提供的服务的时候没有设置超时程序被卡住了怎么办?,如何模拟超时的情况?...
  10. 平板android优化网络,Android版Firefox更新 针对平板设备优化