精华内容
下载资源
问答
  • python 二进制文件读写

    千次阅读 2016-12-12 17:04:01
    前言:emacs打开文件真的很快,用记事本打开一个70M的txt文件卡了很久,emacs秒开,无卡顿。

    前言:emacs打开文件真的很快,用记事本打开一个70M的txt文件卡了很久,emacs秒开,无卡顿。

    int8 [128,127]

    import numpy
    i = numpy.int8(0) ###    i=0
    i = numpy.int8(127) ###    i=127
    i = numpy.int8(128) ###   i= -128
    i = numpy.int8(129) ###   i= -127
    i = numpy.int8(-129) ###  i= 127
    i = numpy.int8(-130) ###  i= 126
    i = numpy.int8(-256) ### i = 0

    我们可以使用类似于圆形时钟表盘的图来记忆,如下图:

    这里写图片描述

    红色代表真实值,灰色代表 numpy.int8(X) 代表 X 的数值;

    原码 反码 补码
    127 01111111 01111111 01111111
    -127 - 10000000 10000001
    -128 - 10000000

    下面是一个读写二进制文件的例子:

    from struct import unpack
    import struct
    matfn = "CH20"
    fid=open(matfn,'rb')
    fw = open("rust.txt",'w')
    while True:
        tmp = struct.unpack("h",fid.read(2))
        if len(tmp) == 0:
            break
        print (tmp[0])
    fid.close()

    读取文件的时候需要知道保存二进制的格式,譬如是几个字节之类,关于unpack的参数可以参考这篇博客:嘎啦

    展开全文
  • 本文简单小结一下Python二进制文件读写。在Python中实现二进制文件读写需要导入struct模块,对数据进行打包处理再写入文件。以下直接举一个简短的程序示例: 1 #!/usr/bin/python 2 import struct 3 ...

    小量最近用PySCF计算Hartree-Fock轨道传递给自己的程序使用,为了保证精度和节省硬盘空间,使用二进制文件来传递数据。本文简单小结一下Python的二进制文件的读写。

    在Python中实现二进制文件的读写需要导入struct模块,对数据进行打包处理再写入文件。以下直接举一个简短的程序示例:

      1   #!/usr/bin/python

      2   import struct

      3   f = open('test.bin', 'w+b')

      4   a0 = 1

      5   a1 = 2

      6   data = struct.pack('2i', a0, a1)

      7   f.write(data)

      8   f.seek(0)

      9   data2 = f.read()

     10   (a, b) = struct.unpack('ii', data2)

     11   print a, b

    第3行,打开文件时,模式需要添加'b'模式,表示二进制模式。注意,以读写模式打开时,不能写rw,应该写r+或w+模式。

    第6行,将数据转化成二进制并进行打包。其通用格式为struct.pack(fmt,v1,v2,...)。由于python中数据不需要声明类型,因此需要在打包时指明数据类型,才能确定数据的字节数。例如本例中2i表示将两个整型数进行打包。各种数据类型所用的符号以及所占的字节数在Python的官方手册中有列表:

    0152f163693ac172fa702acbfa692a56.png

    第7行,将数据写入文件。

    第10行,将读出的数据解包,并根据数据类型转化为普通格式。注意,解包出来的数据会构成一个元组,因此,如果只有一个数据,要写成a,或者(a,)。

    笔者遇到一个问题,始终不知道是何原因,如果有小伙伴知道,请留言告知。笔者尝试将一个整数和一个浮点数打包,格式为'id',按理来说,i占4位,d占8位,得到的数据应该是12位,但观察到的是16位。后来笔者又用做了一系列测试,结果如下:

    >>> struct.calcsize('id')

    16

    >>> struct.calcsize('iid')

    16

    >>> struct.calcsize('iiid')

    24

    >>> struct.calcsize('iiiid')

    24

    >>> struct.calcsize('iiiiid')

    32

    >>> struct.calcsize('iiiiiid')

    32

    当i的个数为奇数时,始终会多计算4位。不知当中有何玄机。为避免这个问题,建议大家将不同类型的数据分批打包,依次写入文件。例如第一次单独写一个i类型数据,第二次单独写入一个d类型数据,得到的大小就是12。

    最后,顺便提一下Fortran中二进制文件的读写。在彭国伦的教材中提到,文件的格式有两种:formatted和unformatted,其实还有第三种格式:binary。如果用Fortran程序读取上述Python代码生成的二进制文件,使用unformatted时,无法正常读出,需要写成binary格式:

    program main

    implicit none

    integer*4 a,b

    open(unit=10,file='test.bin',form='binary')

    read(10) a,b

    write(*,*) a,b

    end

    注意在Python中是以4位存储的整数,因此在Fortran中要声明4位的整数来读取。

    展开全文
  • python读取二进制流 Python二进制方式读写文件发布时间:2017-03-18来源:服务器之家这两天用Python解析ELF二进制文件,遇到了不少问题,总结整理如下,以便加深对Python的理解。以二进制读取文件,也就是’rb’格式...

    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没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。import structa=12.34#将a变为二进制bytes=struct.pack('i',a)此时bytes...

    总的感觉,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'来表示换行。

    展开全文
  • 对于二进制代码的读取:import structwith open('valid0_0','rb') as f:#valid0_0二进制文件名f.seek(0,2)n=f.tell()f.seek(0,0)buf=f.read(n)m=int(n/4)#4是根据你数据的类型和你之前定义的buf长度确定print(m,n)...
  • python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。import structa=12.34#将a变为二进制bytes=struct.pack('i',a)此时bytes...
  • python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。import structa=12.34#将a变为二进制bytes=struct.pack('i',a)此时bytes...
  • python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。import structa=12.34#将a变为二进制bytes=struct.pack('i',a)此时bytes...
  • 基础:open(path, mode, b_buffer_size),需要指出的是第三个参数,它用来控制IO的时候是否使用缓存,这个缓存指的是python自己开辟的一片内存吧。seek(offset),设置文件的偏移指针read(size), 读取size这么多内容...
  • python 二进制文件处理采用python处理二进制文件文件打开方式需要设置成"rb"或"wb",使读写的数据流是二进制。还需要进行二进制数据和普通数据之间的转换。这时会用到python的包struct里的两个函数pack和unpack。...
  • 本文实例讲述了python读写二进制文件的方法。分享给大家供大家参考。具体如下:初学python,现在要读一个二进制文件,查找doc只发现 file提供了一个read和write函数,而且读写的都是字符串,如果只是读写char等一个...
  • 下面小编就为大家带来一篇使用Python进行二进制文件读写的简单方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Python二进制文件读写需要注意的地方 Python二进制文件读写需要注意的地方 - 代码示例 - 博客园Python二进制文件读写需要注意的地方# -*- coding: utf-8 -*-#! /usr/bin/env python3import ...
  • 1. 什么是.bin文件扩展名为.bin的文件就是一个二进制文件(binary)。不同于文本文件二进制文件用记事本、Notepad++等打开都是乱码。像是这样:但是.bin文件可以用WINHEX等软件打开。二进制文件里面存储的都是数据...
  • 本文所用环境:Python 3.6.5 |Anaconda custom (64-bit)|引言由于某些原因,需要用python读取二进制文件,这里主要...这里主要讨论,python二进制转浮点数的操作。python中一个float类型的数占4个字节。二进制数据转...
  • python 二进制文件读写

    千次阅读 2018-05-31 10:12:34
    对于二进制代码的读取: import struct with open('valid0_0','rb') as f:#valid0_0二进制文件名 f.seek(0,2) n=f.tell() f.seek(0,0) buf=f.read(n) m=int(n/4)#4是根据你数据的类型和 print(m,n) print...
  • 如何用python生成和读取二进制文件可以使用numpy.fromfile(),也可以使用open(filename, 'rb'),其中的'b'就是二进制的意思,然后使用文件类型的read方法,读取一些字节,再用struct.unpack()方法来解析二进制。...
  • 总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。 python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为...
  • Python二进制文件读写问题

    千次阅读 2018-03-05 19:53:37
    我们使用处理二进制文件时,需要用如下方法 binfile=open(filepath,’rb’) 读二进制文件 binfile=open(filepath,’wb’) 写二进制文件 那么和binfile=open(filepath,’r’)的结果到底有何不同呢? 不同之处有两...
  • 本文实例讲述了python读写二进制文件的方法。分享给大家供大家参考。具体如下:初学python,现在要读一个二进制文件,查找doc只发现 file提供了一个read和write函数,而且读写的都是字符串,如果只是读写char等一个...
  • 总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。 python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string...
  • 本文实例讲述了python读写二进制文件的方法。分享给大家供大家参考。具体如下:初学python,现在要读一个二进制文件,查找doc只发现 file提供了一个read和write函数,而且读写的都是字符串,如果只是读写char等一个...
  • Python:二进制文件读写

    千次阅读 2015-04-13 13:17:41
    欢迎使用Markdown编辑器写博客要求打开一个文件,按照二进制读入数据。解决Python文件中读取和写入的一般是字符串类型数据。因此,为了处理二进制数据,需要一种二进制数据到字符串数据的变换工具。struct模块提供...
  • Python二进制文件的读取与写入

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,208
精华内容 16,083
关键字:

python二进制文件读写

python 订阅