zoukankan      html  css  js  c++  java
  • Python 读写二进制文件 以及Numpy读写二进制文件

    原文地址: https://blog.csdn.net/and_then111/article/details/86744938
    原文地址: https://www.cnblogs.com/hxvicky/p/4645303.html

    1. 什么是.bin文件

    扩展名为.bin的文件就是一个二进制文件(binary)。不同于文本文件,二进制文件用记事本、Notepad++等打开都是乱码。
    像是这样:
    用记事本打开了一个.bin文件
    但是.bin文件可以用WINHEX等软件打开。二进制文件里面存储的都是数据,只有按照某个预先设定的规则读出,才能明白这些数字的具体含义。

    WINHEX将二进制文件内容转为十六进制的形式展现出来:
    用WINHEX打开了一个.bin文件
    二进制文件相比于文本文件的优点:节约存储空间、读写速度快、有一定的加密保护作用。

    关于二进制文件与文本文件,可以参考下这个博客程序员别唬我系列之:二进制文件

    2. 二进制文件读写

    2.1 读二进制文件

    读二进制文件 “x.bin” 的内容,每次输出一个字节。
    (1) 文件路径放在filepath中,这里将.bin文件与代码文件放在了同一个文件夹下,因此没有写绝对路径。

    (2) open(filepath, 'rb'):以读的形式打开文件文件,注意使用 rb 来读二进制文件。

    (3) 记得close: binfile.close()

    import struct
    import os
    if __name__ == '__main__':
        filepath='x.bin'
        binfile = open(filepath, 'rb') #打开二进制文件
        size = os.path.getsize(filepath) #获得文件大小
        for i in range(size):
            data = binfile.read(1) #每次输出一个字节
            print(data)
        binfile.close()
    

    运行,输出结果:
    结果

    如果想看到十进制的结果,可以使用python中的struct.unpack()方法:
    struct.unpack('B', data):这里的参数B的含义是将C结构数据的unsigned char 类型转为python中的integer
    这里得到的num是tuple类型,因此使用num[0]将数字取出。

    for i in range(size):
        data = binfile.read(1)
        num = struct.unpack('B', data)
        print(num[0])
    

    输出结果为:
    在这里插入图片描述

    2.2 写二进制文件

    (1) 假设要把数字123写入二进制文件,首先需要把数字int类型转为bytes类型。
    data.to_bytes(1, 'big'):参数 ‘1’ :转为1个字节的bytes; 参数 'big’ :byteorder。

    查看某个变量a的类型,可以利用type()

    a=123
    print('a:',type(a))
    b=a.to_bytes(1,'big')
    print('b:',type(b))
    

    输出:

    (2) open(filepath, 'ab+') :写模式打开二进制文件。
    写入时注意:使用 ab+ 来完成追加写入,使用 wb来完成覆盖写入。

    (3) 关闭binfile.close()

    data=123
    content= data.to_bytes(1, 'big')
    
    filepath='123.bin'
    binfile = open(filepath, 'ab+') #追加写入
    binfile.write(content)
    print('content',content)
    binfile.close()
    

    2.3 打开文件模式

    列了下打开文件的不同模式,也就是open()里第二个参数。 带b的参数表示操作二进制文件,不带b的操作文本文件。
    摘自Python文件读写(open(),close(),with open() as f…

    模式 描述
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    numpy 保存数据

    以3*4数组a为例:

    方法1:

    a.tofile("filename.bin")

    这种方法只能保存为二进制文件,且不能保存当前数据的行列信息,文件后缀不一定非要是bin,也可以为txt,但不影响保存格式,都是二进制。

    这种保存方法对数据读取有要求,需要手动指定读出来的数据的的dtype,如果指定的格式与保存时的不一致,则读出来的就是错误的数据。

    b = numpy.fromfile("filename.bin",dtype = **)

    读出来的数据是一维数组,需要利用

    b.shape = 3,4重新指定维数。

    方法2.

    numpy.save("filename.npy",a)

    利用这种方法,保存文件的后缀名字一定会被置为.npy,这种格式最好只用

    numpy.load("filename")来读取。

    方法3.

    numpy.savetxt("filename.txt",a)

    b = numpy.loadtxt("filename.txt")

    用于处理一维和二维数组

  • 相关阅读:
    pgspider sqlite mysql docker 镜像
    pgspider docker 镜像
    pgspider基于pg 的高性能数据可视化sql 集群引擎
    diesel rust orm 框架试用
    golang 条件编译
    Performance Profiling Zeebe
    bazel 学习一 简单java 项目运行
    一个好用node http keeplive agnet
    gox 简单灵活的golang 跨平台编译工具
    mailhog 作为smtp server mock工具
  • 原文地址:https://www.cnblogs.com/charleechan/p/12698637.html
Copyright © 2011-2022 走看看