精华内容
下载资源
问答
  • Python二进制文件读取并转换Python二进制文件读取并转换标签(空格分隔): python本文所用环境:Python 3.6.5 |Anaconda custom (64-bit)|引言由于某些原因,需要用python读取二进制文件,这里主要用到struct包,而...

    Python二进制文件读取并转换

    Python二进制文件读取并转换

    标签(空格分隔): python

    本文所用环境:

    Python 3.6.5 |Anaconda custom (64-bit)|

    引言

    由于某些原因,需要用python读取二进制文件,这里主要用到struct包,而这个包里面的方法主要是unpack、pack、calcsize。详细介绍可以看:Python Struct 官方文档。这里主要讨论,python二进制转浮点数的操作。

    python中一个float类型的数占4个字节。

    二进制数据转float,可以用struct.unpack()来实现。

    小文件读取

    较小的文件,可以一次读取:

    首先导入所需的包:

    import numpy as np

    import struct

    例如:我需要读取一个名为filename,存放着形状为[100,1025]的浮点数的文件。可以采用以下办法

    # 加载测试数据

    f = open('filename','rb')

    # 102500为文档中包含的数字个数,而一个浮点数占4个字节

    data_raw = struct.unpack('f'*102500,f.read(4*102500))

    f.close()

    verify_data = np.asarray(verify_data_raw).reshape(-1,1025)

    大文件处理方法

    我需要处理的文件大小有38.1G,存放着[10000000,1025]大小的向量。

    34784712.jpg

    关于大文件的处理,我参考了这位博主的文章-强悍的 Python —— 读取大文件,前两种方法都会造成MemoryError。第三种不会,但是,这个方法不能很好的将二进制文件转换成浮点数。

    所以我想到了另外一种办法:

    通过Linux命令切割文件

    通过split命令将38.1G的文件按照指定大小切割,

    split -b 820000k -a 2 filename data_

    上述代码的意思是,指定每块大小为820000k,-a 2代表2位数命名,‘data_’代表前缀是’data_’

    最终生成49个文件(字典序 aa – bw),前48个文件每个204800行 最后一个文件 169600行

    820000 = 4_1025_204800/1024

    通过python循环读取文件

    首先构建词汇表:

    voc = ['a','b','c','d','e','f','g','h','i','j','k','l',

    'm','n','o','p','q','r','s','t','u','v','w','x',

    'y','z']

    voc_short = ['a','b','c','d','e','f','g','h','i','j','k','l',

    'm','n','o','p','q','r','s','t','u','v']

    为了方便读取,将49个二进制文件转换成numpy专用二进制格式*.npy

    for i in voc:

    data_name = 'data_a'+str(i)

    f = open(data_name,'rb')

    data_raw = struct.unpack('f'*209920000,f.read(4*209920000))

    f.close()

    data = np.asarray(data_raw).reshape(-1,1025)

    np.save(data_name+'.npy',data) # 保存data_a*.npy文件

    for i in voc_short:

    data_name = 'data_b'+str(i)

    f = open(data_name,'rb')

    data_raw = struct.unpack('f'*209920000,f.read(4*209920000))

    f.close()

    data = np.asarray(data_raw).reshape(-1,1025)

    np.save(data_name+'.npy',data) # 保存data_b*.npy文件

    data_name = 'data_bw'

    f = open(data_name,'rb')

    data_raw = struct.unpack('f'*173840000,f.read(4*173840000))

    np.save(data_name+'.npy',data_raw) # 保存data_bw.npy文件

    展开全文
  • 二进制读取文件,也就是’rb’格式读取,这个到底如何理解。其实很简单,以’r’也就是文本读取时,比如读取一个文本文件,其中有个字符串:12345678。以’r’格式读取,那得到的就是串‘1234...

    python读取二进制流 Python二进制方式读写文件

    发布时间:2017-03-18

    来源:服务器之家

    这两天用Python解析ELF二进制文件,遇到了不少问题,总结整理如下,以便加深对Python的理解。

    以二进制读取文件,也就是’rb’格式读取,这个到底如何理解。

    其实很简单,以’r’也就是文本读取时,比如读取一个文本文件,其中有个字符串:12345678。以’r’格式读取,那得到的就是串‘12345678’,你可以直接对这个字符串进行操作,这个方式是以用户友好的字符方式显示,你可以对其进行串连接,切片操作。

    如果以‘rb’格式读取,那得到的是也是个串,只是这个串中存储的是各个字符的ASCII值。也就是说,存储的是\x31\x32\x33\x34\x35\x36\x37\x38,注意:这里是串中是没有\x的,\x只是表示这个数据是16进制。另外,也不要将31理解成3和1两个字符了,31是0x31是个整体,是一个字符,表示字符1。从这个角度来说,你可以认为它是HEX值流。因为这个串中都是16进制数,所以你要将它当成数来看,用数的操作符号去解析它。比如,将这个串赋值给strHex=’\x31\x32\x33\x34\x35\x36\x37\x38’,len(strHex)=8,注意,不是等于16,原因是显然的,\x31表示一个字符。strHex[0:1]得到的是\x31数字。ord(strHex[0:1])这样是可以的,虽然,strHex[0:1]是个数字,但是从字符的角度来说,它又是字符1,所以ord(strHex[0:1])相当于ord(‘1’),从这个角度可看出,字符和Hex值两个角度互补考虑,对理解二进制还是很有帮助的。

    另外,还发现Python还提供了两个类:memoryview和bytearray。Memoryview是只读的,它允许Python代码访问内部对象的内部数据,所以显然要只读了。只是这个对象要支持buffer protocol(不知道是什么东西)。Memoryview有个元素的概念,这个元素是原子性的,由对象来操作。简单的类型如str和bytearray,其元素就是一个字节。但是第三方类型可能元素会大些。所以,可以看出,memoryview其实就是就像str一样,以元素为单位将同类元素组合在一起。只是memoryview可以以对象为参数,比如v=memoryview(‘abcdefg’),这个和字符串没什么区别,但是如果v=memoryview(obj),obj是个对象,那么就得到了对象的内存了。

    Memoryview也支持切片操作,返回str类型。

    所以,‘r’和‘rb’的区别在于,一个得到的是对用户友好的字符,一个得到的对程序友好的字符的Hex值,在写程序时,要从Hex值和字符两个角度共同思考。

    f=open('test.bin','wb')

    f.truncate()

    s='\x22\x32\xdd\xfd\xab'

    data=bytearray('gggggggg')

    data[1:4]='\xAA\xBB\xCC'

    print len(data)

    b='a'

    a=memoryview(b)

    print a.readonly

    v=memoryview('abcdefg')

    f.write(s)

    f.write(data)

    f.close()

    展开全文
  • python二进制读取文件 很多时候,都需要用到二进制读取文件。毕竟很多信息不是以文本的形式存储。例如:图片,音乐等等。这些东西都是有规则的二进制文件。 在python中,二进制读取采用rb的方式。 f = open(file_name...

    python二进制读取文件

    很多时候,都需要用到二进制读取文件。毕竟很多信息不是以文本的形式存储。例如:图片,音乐等等。这些东西都是有规则的二进制文件。
    在python中,二进制读取采用rb的方式。

    f = open(file_name,"rb+")
    data = f.read(1) #这样data是一个b开头的ASCII数字。
    f.close()
    print(ord(data)) #将二进制数据转化为10进制数据。

    转载于:https://www.cnblogs.com/ply616/p/5699297.html

    展开全文
  • 二进制读取文件比普通方式要快上三倍不止?! 结果查看 可以看到二进制读取文件所用时间只是一般读取的三分之一乃至五分之一,这个提升是巨大的,在文本文件较小的情况下,时间差距不易被察觉,但是当文件大小较大...

    二进制读取文件比普通方式要快上三倍不止?!

    结果查看

    读取1800kb的三国演义
    读取3500kb的天龙八部
    可以看到二进制读取文件所用时间只是一般读取的三分之一乃至五分之一,这个提升是巨大的,在文本文件较小的情况下,时间差距不易被察觉,但是当文件大小较大且需要大量读取的时候,节省下的读取时间还是非常可观的!

    实验过程

    import time
    
    """三国演义 1727KB """
    t11 = time.perf_counter()
    with open('6.3.1三国演义.txt', 'rb+') as read_b:
        with open('三国演义二进制副本.txt', 'wb') as write_b:
            write_b.write(read_b.read())
            t12 = time.perf_counter()
    
    t21 = time.perf_counter()
    with open('6.3.1三国演义.txt', 'r', encoding='utf-8') as read_nom:
        with open('三国演义普通副本.txt', 'w+', encoding='utf-8') as write_nom:
            write_nom.write(read_nom.read())
            t22 = time.perf_counter()
    
    print('二进制消耗时间:', t12-t11)
    print('普通消耗时间:', t22-t21)
    print((t12-t11)/(t22-t21)*100, '%')
    
    
    """天龙八部 3472KB"""
    t11 = time.perf_counter()
    with open('6.5.2-天龙八部.txt', 'rb+') as read_b:
        with open('天龙八部二进制副本.txt', 'wb') as write_b:
            write_b.write(read_b.read())
            t12 = time.perf_counter()
    
    t21 = time.perf_counter()
    with open('6.5.2-天龙八部.txt', 'r', encoding='utf-8') as read_nom:
        with open('天龙八部普通副本.txt', 'w+', encoding='utf-8') as write_nom:
            write_nom.write(read_nom.read())
            t22 = time.perf_counter()
    
    print('二进制消耗时间:', t12-t11)
    print('普通消耗时间:', t22-t21)
    print((t12-t11)/(t22-t21)*100, '%')
    

    差异分析

    我们知道,数据在计算机内部都是以二进制存储的,在进行非文本操作的时候,我们只能使用二进制方式读取文件,存储写入计算机,但是在进行文本操作的时候,Python提供给了我们直接读取文本信息的读文件操作。
    但是,通过上面的实验,我们可以发现,写入操作时,使用二进制的方式写入要比普通写入快上若干倍,因此。再不需要print函数打印输出内容的时候,请尽量使用二进制方式写入文本内容

    展开全文
  • 主要介绍了Python二进制文件读取并转换为浮点数详解,用python读取二进制文件,这里主要用到struct包,而这个包里面的方法主要是unpack、pack、calcsize。,需要的朋友可以参考下
  • Python二进制文件读取与写入

    万次阅读 2019-06-20 19:12:59
    Python二进制文件读取与写入 当读取音视频、图片等二进制文件时,需要采用二进制的读取方法。 一、读取 with open(file,mode) as f: pass file:文件路径 mode:rb 读取二进制文件 strb = f.read() 功能:一次性读取...
  • python二进制文件读取

    千次阅读 2019-01-19 15:53:47
    python读取二进制文件时,想要获取读取字节的16进制(默认read返回的是ascii码)。 例如文件内容为“helloworld”,若读取1Byte,则读到的数据为’h’,但是想要得到该字符的16进制’0x68’ # cat testdata hello...
  • 我发现用Python读取二进制文件特别困难。你能帮我一把吗?我需要读取这个文件,在Fortran 90中,该文件很容易被int*4 n_particles, n_groupsreal*4 group_id(n_particles)read (*) n_particles, n_groupsread (*) ...
  • 默认读取文件都是ASCII编码的文本文件2. 如果读取的文件是二进制文件,如图片,视频需要使用"rb"模式3. 读取非ASCII编码的文本文件,必须 以二进制模式打开,再解码f=open("E:/test.txt","...
  • 我发现python struct.unpack()非常方便读取其他程序生成的二进制数据.问题:如何从二进制文件读取16字节长的双倍内容?以下C代码将1.01写入三次到二进制文件,分别使用4字节浮点数,8字节双精度数据块和16字节长双...
  • 虽然读取文件的方式各种各样,但是通过二进制,还是头一次,实现过过程并不难,我们需要将文件先做好封存,以函数的形式,保存下来,然后直接导入进行使用,这样就可以读取文件,因为直接二进制读取是不现实的,只能...
  • 最近使用python读取了.RInt格式的二进制文件,方法分享如下: 如对应c++存储了如下变量: char a[512]; unsigned char b; unsigned char c; uint32_t d; .... 如在.RInt文件中存储了上述格式的数据,分别...
  • Python 二进制文件读取显示

    千次阅读 2018-01-07 17:37:35
    [python] view plain copy filename=raw_input('enter file name:')  f=open(filename,'rb')  f.seek(0,0)  index=0  for i in range(0,16):   print "%3s" % hex(i) ,  ...
  • https://blog.csdn.net/qq_21644175/article/details/79966397?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-3-79966397.nonecase&utm_term=python%E5%88%9B%E5%BB%B...
  • 使用Python读取二进制文件

    万次阅读 多人点赞 2018-03-13 09:00:25
    目标:目标文件为一个float32型存储的二进制文件,按列优先方式存储。本文使用Python读取该二进制文件并... 读取二进制文件 首先使用open函数打开文件,打开模式选择二进制读取"rb"。f = open(filename, ...
  • python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。import structa=12.34#将a变为二进制bytes=struct.pack('i',a)此时bytes...
  • I feel binary data don't have such things like end-of-...Python不知道它正在读取二进制文件,除非您告诉它。当python读取文本文件时,它会自动将\n任何字符转换为操作系统的换行符,在Windows上是\r\n这是所有计...
  • Python:二进制文件读取

    2019-12-17 16:45:11
    根据研究需要编写一个使用PCA方法对高光谱图像进行全锐化的程序,结果第一步读取文件就犯了难:给定的文件是一个二进制文件,没有文件后缀名。查阅相关资料解决问题后记录如下: 解决思路 第一步:读出文件 其实...
  • 主要介绍了Python读取二进制文件代码方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • path = './二进制文件所在文件夹名称' # 文件夹地址 new_path = './要存放生成txt文件的文件夹名称/' # 新的存放生成文件的文件夹地址 b_list = ['此处填写二进制文件名称(也可以参考2020.11.10所写博客,利用...
  • 首先使用open函数打开文件,打开模式选择二进制读取”rb”。 f = open(filename, "rb") 第二步,需要打开按照行列读取文件,由于是纯二进制文件,内部不含邮任何的数据结构信息,因此我们需要给定二进制数据的行数...
  • python二进制文件读取 在matlab中,通过命令:A=fread(fileID,sizeA,precision,skip,machinefmt) ;读取,其中precision 需要读取数据的类型和大小,默认’uint8=>double’ 常见有uint,uint8、uint16等数据...
  • python 内存二进制读取图片

    千次阅读 2017-09-12 20:33:41
    python 内存二进制读取图片
  • 这里显示的是,读取一个BMP图像后的效果     从这里,可以看出,print语句和C的printf对格式要求是一致的,或者说,Python采用了C的格式规范。   print "%-3s" % "#" , 逗号防止...
  • Python 二进制文件读取显示 .

    千次阅读 2011-12-27 22:53:41
    这里显示的是,读取一个BMP图像后的效果     从这里,可以看出,print语句和C的printf对格式要求是一致的,或者说,Python采用了C的格式规范。   print "%-3s" % "#" , 逗号防止...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,099
精华内容 32,839
关键字:

python二进制读取文件

python 订阅