精华内容
下载资源
问答
  • 读取二进制数据到可变缓冲区中 问题 你想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。 或者你想原地修改数据并将它写回到一个文件中去。 解决方案 为了读取数据到一个可变数组中,...

    读取二进制数据到可变缓冲区中

    问题

    你想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。 或者你想原地修改数据并将它写回到一个文件中去。

    解决方案

    为了读取数据到一个可变数组中,使用文件对象的 readinto() 方法。比如:

    import os.path
    
    def read_into_buffer(filename):
        buf = bytearray(os.path.getsize(filename))
        with open(filename, 'rb') as f:
            f.readinto(buf)
        return buf

    下面是一个演示这个函数使用方法的例子:

    >>> # Write a sample file
    >>> with open('sample.bin', 'wb') as f:
    ...     f.write(b'Hello World')
    ...
    >>> buf = read_into_buffer('sample.bin')
    >>> buf
    bytearray(b'Hello World')
    >>> buf[0:5] = b'Hello'
    >>> buf
    bytearray(b'Hello World')
    >>> with open('newsample.bin', 'wb') as f:
    ...     f.write(buf)
    ...
    11
    >>>

    讨论

    文件对象的 readinto() 方法能被用来为预先分配内存的数组填充数据,甚至包括由 array 模块或 numpy 库创建的数组。 和普通 read() 方法不同的是, readinto() 填充已存在的缓冲区而不是为新对象重新分配内存再返回它们。 因此,你可以使用它来避免大量的内存分配操作。 比如,如果你读取一个由相同大小的记录组成的二进制文件时,你可以像下面这样写:

    record_size = 32 # Size of each record (adjust value)
    
    buf = bytearray(record_size)
    with open('somefile', 'rb') as f:
        while True:
            n = f.readinto(buf)
            if n < record_size:
                break
            # Use the contents of buf
            ...

    另外有一个有趣特性就是 memoryview , 它可以通过零复制的方式对已存在的缓冲区执行切片操作,甚至还能修改它的内容。比如:

    >>> buf
    bytearray(b'Hello World')
    >>> m1 = memoryview(buf)
    >>> m2 = m1[-5:]
    >>> m2
    <memory at 0x100681390>
    >>> m2[:] = b'WORLD'
    >>> buf
    bytearray(b'Hello WORLD')
    >>>

    使用 f.readinto() 时需要注意的是,你必须检查它的返回值,也就是实际读取的字节数。

    如果字节数小于缓冲区大小,表明数据被截断或者被破坏了(比如你期望每次读取指定数量的字节)。

    最后,留心观察其他函数库和模块中和 into 相关的函数(比如 recv_into() , pack_into() 等)。 Python的很多其他部分已经能支持直接的I/O或数据访问操作,这些操作可被用来填充或修改数组和缓冲区内容。

    展开全文
  • 想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。或者你想原地修改数据并将它写回到一个文件中去。 为了读取数据到一个可变数组中,使用文件对象的readinto() 方法。比如 import os.path ...

    想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。或者你想原地修改数据并将它写回到一个文件中去。

    为了读取数据到一个可变数组中,使用文件对象的readinto() 方法。比如

    import os.path
    def read_into_buffer(filename):
    buf = bytearray(os.path.getsize(filename))
    with open(filename, 'rb') as f:
    f.readinto(buf)
    return buf
    

    下面是一个演示这个函数使用方法的例子:

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    >>> with open('sample.bin', 'wb') as f:
    ... f.write(b'Hello World')
    ...
    >>> buf = read_into_buffer('sample.bin')
    >>> buf
    bytearray(b'Hello World')
    >>> buf[0:5] = b'Hallo'
    >>> buf
    bytearray(b'Hallo World')
    >>> with open('newsample.bin', 'wb') as f:
    ... f.write(buf)
    ...
    11
    >>>
    

    文件对象的readinto() 方法能被用来为预先分配内存的数组填充数据,甚至包括由array 模块或numpy 库创建的数组。和普通read() 方法不同的是, readinto() 填充已存在的缓冲区而不是为新对象重新分配内存再返回它们。因此,你可以使用它来避免大量的内存分配操作。比如,如果你读取一个由相同大小的记录组成的二进制文件时,你可以像下面这样写:

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    record_size = 32 # Size of each record (adjust value)
    buf = bytearray(record_size)
    with open('somefile', 'rb') as f:
    while True:
    n = f.readinto(buf)
    if n < record_size:
    break
    # Use the contents of buf
    

    另外有一个有趣特性就是memoryview ,它可以通过零复制的方式对已存在的缓冲区执行切片操作,甚至还能修改它的内容。比如:

    >>> buf
    bytearray(b'Hello World')
    >>> m1 = memoryview(buf)
    >>> m2 = m1[-5:]
    >>> m2
    <memory at 0x100681390>
    >>> m2[:] = b'WORLD'
    >>> buf
    bytearray(b'Hello WORLD')
    >>>
    

    使用f.readinto() 时需要注意的是,你必须检查它的返回值,也就是实际读取的字节数。如果字节数小于缓冲区大小,表明数据被截断或者被破坏了(比如你期望每次读取指定数量的字节)。最后,留心观察其他函数库和模块中和into 相关的函数(比如recv into() ,pack into() 等)。Python 的很多其他部分已经能支持直接的I/O 或数据访问操作,这些操作可被用来填充或修改数组和缓冲区内容。

    展开全文
  • python读取二进制mnist实例详解 training data 数据结构: [offset] [type] [value] [description] 0000 32 bit integer 0x00000803(2051) magic number 0004 32 bit integer 60000 number of images 0008 32 ...
  • 第二步,需要打开按照行列读取文件,由于是纯二进制文件,内部不含邮任何的数据结构信息,因此我们需要给定二进制数据的行数列数(nx和ny)来确定图像的形状。这里我们的数据类型是float32型的,对应过来是4bytes,...
  • 多的不解释了直接上代码 #!/usr/bin/python ...# dec,=struct.unpack('B',binChar) 二进制字节数据转为十进制 # bin(dec) 十进制转为二进制 # hex(dec) 十进制转为16进制 # int('0x10', hexData) 16进制转十进制

    多的不解释了直接上代码

    #!/usr/bin/python
    #-*-coding:utf-8-*-
    
    import struct
    
    ###知识点说明####
    # dec,=struct.unpack('B',binChar) 二进制字节数据转为十进制
    # bin(dec) 十进制转为二进制
    # hex(dec) 十进制转为16进制
    # int('0x10', hexData) 16进制转十进制
    # binData=struct.pack('B',HexByte) 16进制字节转二进制字节
    # struct的使用参考链接:http://www.cnblogs.com/jiangzhaowei/p/6138866.html
    
    # 十六进制数据转二进制字节流,如efefef作为参数进行转化
    def HexToBin(hexData):
        Hex_byteString = ''
        binData = ''
        while hexData:
            Hex_byteString = hexData[0:2]  # 分割字符串,获取前两个字符
            Hex_byte = int(Hex_byteString, 16)  # 字符串转换成16进制
            binData += struct.pack('B', Hex_byte)  # 转换成字节流,“B“为格式符,代表一个unsigned char (具体请查阅struct)
            hexData = hexData[2:]  # 分割字符串,去掉字符串前两个字符
        return binData
    
    def ShowByte(num):
        Bin_voicePackage = ""
        Hex_voicePackage = ""
        for i in range(num):
            voiceString = str(voiceArray[i])
            print "===============" 
            a,=struct.unpack('B',voiceString) #二进制字节转为十进制正整数
            print('Bin is:'+voiceString) #显示存储的二进制字节
            print('Dec is:'+str(a)) #显示转化成的十进制正整数
            print('Hex is:'+hex(a)) #显示转化成的16进制数据
            Bin_voicePackage+=str(a) #连接十进制数据
            Hex_voicePackage+=hex(a) #连接十六进制数据
        print ''.join(voiceArray[:num])
        print Bin_voicePackage
        print Hex_voicePackage
    
    def DoSomething(readData):
        global voiceArray
        voiceArray.append(readData)
    
    if __name__ == '__main__':
        voiceArray = []
        
        #二进制文件读取
        binfile = open('voice.spx', 'rb')
        try:
            while True:
                readData = binfile.read(1)
                if not readData:
                    break
                DoSomething(readData)
        finally:
            binfile.close()
    
        #获取前n个字符,并分别用二进制、十进制、十六进制显示,并展现这些字符的连接显示
        n=5
        ShowByte(n)
    


    展开全文
  • 数据类型的对应 现在有c++对应的带union结构定义如下 typedef struct ProductInfoDef { union { struct { char szID[50]; int nType; char szProvince[120]; int nYear; int...

    数据类型的对应

    现在有c++对应的带union结构定义如下

    typedef struct ProductInfoDef 
    {
    	union 
    	{
    		struct 
    		{
    			char szID[50];			
    			int  nType;			
    			char szProvince[120];	
    			int  nYear;								
    			int  nQuarter;							
    			long nSheetCount;						
    		}; 
    		BYTE byReserve[512]; 
    	};
    } ProductInfoDef; 
    

    我们要从二进制文件中读取数据要用到python的struct包,首先我们要告诉他我们数据格式是怎么样的

    char szID[50];			--------50s (s代表char[]类型, 50s代表char[50]int  nType;			    --------i    (int类型)
    char szProvince[120];	--------120s
    int  nYear;				--------i				
    int  nQuarter;			--------i				
    long nSheetCount;		--------q    (long类型)
    

    于是我们可以得到fmt="@50si120s2iq",其中的两个连续的int类型连起来写为2i,@字符指示字节模式使用c语言的模式,也就是会算上字节对齐。
    我们可以使用struct.calcsize(fmt)来计算现在结构大小是多少

    struct.calcsize("@50si120s2iq")
    Out[8]: 192
    

    带有union的格式处理

    但是我们的结构是带有union的,最少有512字节,所以fmt="@50si120s2iq并没有将所有数据读入,如果我们读取连续结构体,将会报错,所以需要将剩余的512-192=420字节算上去,这里我用420大小字符数组存储多余的字节,得到最终的格式定义是fmt="@50si120s2iq420s

    文件读取

    from functools import partial
    
    RECORD_SIZE = struct.calcsize(fmt)
    with open(r'ProductInfo.dat', 'rb') as f:
         # print(f.__sizeof__(), RECORD_SIZE)
         records = iter(partial(f.read, RECORD_SIZE), b'')
    	 for r in records:
    	 	pass 
    

    这里每次对文件读取固定的大小

    字符串的处理

    对于int类型的数据struct已经做了处理,对于字符串数据就有些麻烦,通常我们会发现字符数组会由空字符带代表字符串结束,将这些数据处理掉将提高可读性

    b'reserved\x00\x00\x00\x00\x00\x00\x00\x00'
    

    接下来把字节数据转化为str类型

    value = str(value, encoding="gb2312")  #我的数据使用gb2312格式
    value = value.strip().strip(b'\x00'.decode())
    
    #strip()去除空格
    #strip(b'\x00'.decode())去除二进制‘\x00’字符,使用decode将空字符转化为str类型
    

    文件保存

    with open(file_save, 'wb') as file_save_dat:
        savedatas = b""  #代表字节数据
        for info in self.list_all_info:
    	    for index, value in enumerate(info):
    	        if index in self.list_indexofstr:
    	        	#将字符串数据用gb2312编码写回去
    	            info[index] = bytes(value, encoding="gb2312")
    	    prehead = struct.pack(fmt,  *info)
    	    savedatas += prehead  #循环累加
        file_save_dat.write(savedatas)  #写入
    
    展开全文
  • python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。import structa=12.34#将a变为二进制bytes=struct.pack("i",a...
  • # 读取数据 bin 文件 import pandas as pd import numpy as np import os import matplotlib.pyplot as plt import struct def read_data(): file_dir = './' file_name = 'Raw Data-1-1Y520230404-10-14-03_8192...
  • Python——读取二进制文件

    千次阅读 2017-09-25 11:13:00
    读取二进制文件并转换成整数在处理MINIST数据集的时候,从网站上下载文件是二进制文件。我们以训练图像数据为例,前4个字节存储的是magic number (2051)。怎么根据这四个字节得到整数2051呢?在使用’rb’方式读取的...
  • python二进制文件读取 在matlab中,通过命令:A=fread(fileID,sizeA,precision,skip,machinefmt) ;读取,其中precision 需要读取数据的类型和大小,默认’uint8=>double’ 常见有uint,uint8、uint16等数据...
  • 很多时候,都需要用到二进制读取文件。毕竟很多信息不是以文本的形式存储。例如:图片,音乐等等。这些东西都是有规则的二进制文件。在python中,二进制读取采用rb...print(ord(data)) #将二进制数据转化为10进制数据...
  • 简单的python代码库可从读取二进制数据 用法示例 设置运行Raspbian的Raspberry Pi 使用requirements.txt中的依赖项创建一个virtualenv virtualenv coffeeEnv pip install -r requirements.txt 在虚拟环境中运行...
  • 读取二进制数据到可变缓冲区中 问题 你想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。或者你想原地修改数据并将它写回到一个文件中去。 解法 为了读取数据到一个可变数组中,使用文件对象...
  • 读取中国气象数据网的一个降水产品的二进制文件数据
  • 本文所用环境:Python 3.6.5 |Anaconda custom (64-bit)|引言由于某些原因,需要用python读取二进制文件,这里主要用到struct包,而这个包里面的方法主要是unpack、pack、calcsize。详细介绍可以看:Python Struct ...
  • Python: 二进制字节流数据读取操作 – bytes 与 bitstring 最近项目有个需求,需要对二进制文件读取内容,操作读取到的字节流数据,主要是查找与切片获取内容。这要求有两个标志,一个开始,一个结束,获取中间的...
  • 读取二进制数据到可变缓冲区中 问题: 想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作,或者想原地修改数据并将它写回 到一个文件中去。 解决方案: 为了读取数据到一个可变数组中,可...
  • Python二进制文件读取结构体

    千次阅读 2015-06-01 17:55:46
    有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重要的三个函数是pack(), unpack(), calcsize...
  • 利用python获取磁盘分区的起始扇区的LBA以及磁盘大小
  • python-解析二进制数据

    2020-10-10 15:45:10
    python-解析二进制数据 '''parse binary file.py''' import numpy as np import struct #输入参数 filename = '1_result2D11.txt' dataPerLine = 12 bytePerData = 4 with open(filename,'rb') as f: #读取文件...
  • 数据来源:...demo.py(读取二进制文件,FixedLengthRecordReader()): import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL']='2' # 设置警告级别 # 读取二进制文件。 (二...
  • 读取二进制文件,首先要明确二进制文件中内部结构为什么样子,我这个二进制文件流是两个字节为一个数字,并且整个bin文件中前四个字节代表图片的分辨率,宽和高。 将bin文件转换为可读数据代码为(想要了解以下...
  • python二进制文件读取

    千次阅读 2019-01-19 15:53:47
    python读取二进制文件时,想要获取读取字节的16进制(默认read返回的是ascii码)。 例如文件内容为“helloworld”,若读取1Byte,则读到的数据为’h’,但是想要得到该字符的16进制’0x68’ # cat testdata hello...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,038
精华内容 415
关键字:

python读取二进制数据

python 订阅