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")

    用于处理一维和二维数组

  • 相关阅读:
    openssl windows ndk 编译----0
    openssl windows ndk 编译
    android Android NDK开发2之Windows及L下的gcc手动编译(交叉连编译
    list 和 set 的区别
    Arrays.toString()方法和Arrays类 的一些概念
    几个简单的面试题
    大脑记忆(自我总结)
    DI() T()函数
    Latex设置
    selenium获取元素信息的方法
  • 原文地址:https://www.cnblogs.com/charleechan/p/12698637.html
Copyright © 2011-2022 走看看