python按字节读文件-使用Python进行二进制文件读写(转)
总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。
python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。
import struct
a=12.34
#将a变为二进制
bytes=struct.pack("i",a)
此时bytes就是一个string字符串,字符串按字节同a的二进制存储内容相同。
再进行反操作
现有二进制数据bytes,(其实就是字符串),将它反过来转换成python的数据类型:
a,=struct.unpack("i",bytes)
注意,unpack返回的是tuple
所以如果只有一个变量的话:
bytes=struct.pack("i",a)
那么,解码的时候需要这样
a,=struct.unpack("i",bytes) 或者 (a,)=struct.unpack("i",bytes)
如果直接用a=struct.unpack("i",bytes),那么 a=(12.34,) ,是一个tuple而不是原来的浮点数了。
如果是由多个数据构成的,可以这样:
a="hello"
b="world!"
c=2
d=45.123
bytes=struct.pack("5s6sif",a,b,c,d)
此时的bytes就是二进制形式的数据了,可以直接写入文件比如 binfile.write(bytes)
然后,当我们需要时可以再读出来,bytes=binfile.read()
再通过struct.unpack()解码成python变量
a,b,c,d=struct.unpack("5s6sif",bytes)
"5s6sif"这个叫做fmt,就是格式化字符串,由数字加字符构成,5s表示占5个字符的字符串,2i,表示2个整数等等,下面是可用的字符及类型,ctype表示可以与python中的类型一一对应。
FormatC TypePython字节数
x
pad byte
no value
1
c
char
string of length 1
1
b
signedchar
integer
1
B
unsignedchar
integer
1
?
_Bool
bool
1
h
short
integer
2
H
unsignedshort
integer
2
i
int
integer
4
I
unsignedint
integer or long
4
l
long
integer
4
L
unsignedlong
long
4
q
longlong
long
8
Q
unsignedlonglong
long
8
f
float
float
4
d
double
float
8
s
char[]
string
1
p
char[]
string
1
P
void*
long
最后一个可以用来表示指针类型的,占4个字节
为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而还提供了
CharacterByte orderSize and alignment
@
native
native 凑够4个字节
=
native
standard 按原字节数
<
little-endian
standard 按原字节数
>
big-endian
standard 按原字节数
!
network (= big-endian)
standard 按原字节数
使用方法是放在fmt的第一个位置,就像"@5s6sif"
-----二进制文件处理时会碰到的问题-----
我们使用处理二进制文件时,需要用如下方法
binfile=open(filepath,"rb") 读二进制文件
或
binfile=open(filepath,"wb") 写二进制文件
那么和binfile=open(filepath,"r")的结果到底有何不同呢?
不同之处有两个地方:
第一,使用"r"的时候如果碰到"0x1A",就会视为文件结束,这就是EOF。使用"rb"则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在"0X1A",就只会读出文件的一部分。使用"rb"的时候会一直读到文件末尾。
第二,对于字符串x="abc/ndef",我们可用len(x)得到它的长度为7,/n我们称之为换行符,实际上是 "0X0A"。当我们用"w" 即文本方式写的时候,在windows平台上会自动将"0X0A"变成两个字符"0X0D","0X0A",即文件长度实际上变成8.。当用"r"文本方式读取时,又自动的转换成原来的换行符。如果换成"wb"二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。"0X0D"又称回车符。
linux下不会变。因为linux只使用"0X0A"来表示换行。
python按字节读文件-使用Python进行二进制文件读写(转)相关推荐
- c/c++入门教程 - 2.5 文件操作、fstream(write写文件、read读文件、ios::binary二进制文件读写)
目录 2.5 文件操作 2.5.1 文本文件 2.5.1.1 写文件 2.5.1.2 读文件 2.5.2 二进制文件 2.5.2.1 二进制写文件 2.5.2.2 二进制读文件 2.5 文件操作 程序 ...
- Python 三种读文件方法read(), readline(), readlines()及去掉换行符\n
Python 三种读文件方法read(), readline(), readlines()及去掉换行符\n 首先, 让我们看下数据demo.txt, 就两行数据. 35durant teamGSW 1 ...
- python字节码文件后缀_如何生成Python的字节码文件
好记性不如烂笔头,看到Python Command-Line Options中有关字节码的生成,记录起来. Python的字节码文件有2种,文件后缀名分别是.pyc和.pyo,前者是普通的字节码, 后 ...
- python 按顺序读文件夹下面的文件
参考 python 按顺序读文件夹下面的文件 - 云+社区 - 腾讯云 方法一: import ospath="/home/test/" #待读取的文件夹path_list=os. ...
- python用with读文件的好处_python小课堂39 - 用 with 优雅的读写文件
python小课堂39 - 用 with 优雅的读写文件 前言 本篇来介绍一下 Python 中的关键词 with 的小技巧.但是在了解 with 之前,需要先了解一下如何使用 Python 对文件进 ...
- python读文件操作-python 之文件操作
使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.txt') try ...
- python读文件每一行、并把这行替换-Python按行读文件
1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1: line = file ...
- python中readlines_python读文件的三个方法read()、readline()、readlines()详解
文件 runoob.txt 的内容如下:1:www.runoob.com 2:www.runoob.com 3:www.runoob.com 4:www.runoob.com 5:www.runoob ...
- python读文件路径-python获取程序执行文件路径的方法(推荐)
1.获取当前执行主脚本方法:sys.argv[0]和_ file _ (1)sys.argv 一个传给Python脚本的指令参数列表.sys.argv[0]是脚本的名字.一般得到的是相对路径,用os. ...
- python读文件代码-Python读取表格类型文件代码实例
这篇文章主要介绍了Python读取表格类型文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 resp = My_Request_ ...
最新文章
- python三维图-python 三维坐标图
- VC++格式化输出单个字符和格式化输出十六进制的不同形式
- tf.lookup.StaticHashTable 用法
- matlab if m不等于0,matlab问题clearfor a=0.1:0.1:50for b=0.1:0.1:20for m=0.1:0.1:5
- react取消所有请求_react 组件关闭后怎么消除还在进行中的ajax
- JDBC 获取被插入数据的主键ID值
- 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
- android 剩余,关于android:android-剩余部分
- python中easygui有几种_Python 模块EasyGui详细介绍
- java服务器客户端程序在联机运行时被防火墙拦截
- Juniper Junos与思科IOS对比配置逻辑合理性
- 8086CPU工作原理
- Android 照相机
- 通过JavaScript中基于属性的TDD的钻石方块
- 神经网络——最大池化
- 直连模式,PAC模式,全局模式的区别
- layUI弹出层组件使用
- 【Selenium】Chromedriver版本(更新至v2.41)与Chrome版本(更新至69)映射关系
- 计算机辅助园林,计算机辅助园林景观设计
- CSP-J 2021
热门文章
- 深入了解TMG企業版的獨立陣列
- SDP中fmtp的使用
- mysql shrink_MySQL Group Replication内存使用分析和优化-1
- 什么是webpack? ----(webpack入门)
- bootstrap css div布局,从css源码理解bootstrap布局容器和栅格系统
- python struct 45s_python32版本,struct.error: argument for 's' must be a bytes object - 小众知识...
- 如何实现手动指定AOP实现JDK代理模式到CGLIB的更改?
- springcloud feign负载均衡_SpringCloud学习笔记(2)——Ribbon
- java session 使用_浅谈Session的使用(原创)
- android studio在夜神上打开_Android Studio 找不到夜神模拟器的解决办法