前言

前段时间使用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中支持的格式如下表:

FormatC TypePython字节数

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根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:

CharacterByte orderSize 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里面返回上一步_Python中的这3个骚操作你会吗?

    本文主要介绍Python的高级特性:列表推导式.迭代器和生成器,是面试中经常会被问到的特性. 因为生成器实现了迭代器协议,可由列表推导式来生成,所有,这三个概念作为一章来介绍,是最便于大家理解的,现在 ...

  5. python里try和except用法_Python中的错误和异常处理简单操作示例【try-except用法】...

    本文实例讲述了Python中的错误和异常处理操作.分享给大家供大家参考,具体如下: #coding=utf8 print ''''' 程序编译时会检测语法错误. 当检测到一个错误,解释器会引发一个异常 ...

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

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

  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 中各种下划线的骚操作:_、_xx、xx_、__xx、__xx__、_classname_...

    我们在定义一些变量或者方法的时候,常常会用到下划线,在 Python 中,下划线可是很有用处的哟,比如变量,有些是一个下划线开头的(_xx),有些是两个下划线开头的(__xx),有些是在名称的结尾添加 ...

最新文章

  1. 数据结构---基础概念
  2. GOROOT、GOPATH
  3. 通过forms来创建用户注册
  4. java 操作系统 模拟 daima_求C/C++或java写的比较简单的操作系统的模拟程序
  5. Python -itertools模块combinations方法
  6. css 模拟器方向_GDS变方向动态循环单剪实验系统VDDCSS
  7. mysql数据库维护_维护MySQL数据库表
  8. C++ Programmer's Cookbook C++基础和C++高级
  9. 计算机专业后悔么,王言匀
  10. vs2005 pro 在浏览器查看下的一个问题!
  11. C++异常处理(一) - iStack
  12. HDU 4079 Happy Telephones 简单题
  13. java通过mysql验证登录注册范例
  14. cv2 python 多线程调用摄像头_2种方法用python调用cv2模块给图片打马赛克
  15. 简述旋转编码器的工作原理_绝对值编码器工作原理以及故障处理方法有哪些?...
  16. 每日英语Daily English
  17. pandas window中涉及的offset是什么意思
  18. XGBoost导读与实战阅读记录(一)——rabit和allreduce
  19. swift WkWebView的返回,goback,跳过同级
  20. MongoDB日常运维之用户管理

热门文章

  1. 常用的linux故障,Linux下常用的故障排查命令行
  2. diy直立双足机器人_速看!近期国内外机器人资讯大汇总
  3. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用factor.plot函数可视化斜交旋转因子分析、并解读可视化图形
  4. R语言层次聚类:通过内平方和(Within Sum of Squares, WSS)选择最优的聚类K值、以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最优的聚类个数
  5. R语言获得所有Aesthetics(美学映射)参数:使用长表输出、使用宽表输出
  6. R语言ggplot2可视化(facet图)使得第一个子图的坐标轴范围一致
  7. Error in plot.new(): figure margins too large
  8. python实现D‘Agostino‘s K-squared test正态分布检验
  9. 复杂基因组测序技术研究进展
  10. oracle中master实例,oracle基础(基本介绍)