【问题标题】:How to write individual bits to a text file in python?如何将单个位写入python中的文本文件?
【发布时间】:2011-03-05 17:31:27
【问题描述】:

假设我有一个像 824 这样的数字,我使用 python 将它写入一个文本文件。在文本文件中,它将占用 3 个字节的空间。但是,如果我使用位表示它,则它具有以下表示 0000001100111000,即 2 个字节(16 位)。我想知道如何在 python 中将位写入文件,而不是字节。如果我能做到这一点,文件的大小将是 2 个字节,而不是 3 个。 请提供代码。我正在使用python 2.6。另外,我不想使用基本安装不附带的任何外部模块 我在下面尝试并给了我 12 个字节!

a =824;
c=bin(a)
handle = open('try1.txt','wb')
handle.write(c)
handle.close()

【问题讨论】:

    标签: python file-io


    【解决方案1】:

    struct 模块是您想要的。从您的示例中, 824 = 0000001100111000 二进制或 0338 十六进制。这是两个字节 03H 和 38H。 struct.pack 会将 824 转换为这两个字节的字符串,但您还必须决定 little-endian(先写入 38H)还是 big-endian(先写入 03H)。

    示例

    >>> import struct
    >>> struct.pack('>H',824) # big-endian
    '\x038'
    >>> struct.pack('<H',824) # little-endian
    '8\x03'
    >>> struct.pack('H',824)  # Use system default
    '8\x03'
    

    struct 返回一个两字节的字符串。 '\x##' 表示法表示(具有十六进制值 ## 的字节)。 '8' 是一个 ASCII '8'(值 38H)。 Python 字节字符串使用 ASCII 表示可打印字符,使用 \x## 表示法表示不可打印字符。

    以下是向文件写入和读取二进制数据的示例。在写入和读取二进制文件时,您应该始终指定字节序,以防它在具有不同字节序默认值的系统上读取:

    import struct
    
    a = 824
    bin_data = struct.pack('<H',824)
    print 'bin_data length:',len(bin_data)
    
    with open('data.bin','wb') as f:
        f.write(bin_data)
    
    with open('data.bin','rb') as f:
       bin_data = f.read()
       print 'Value from file:',struct.unpack('<H',bin_data)[0]
    
    print 'bin_data representation:',repr(bin_data)
    for i,c in enumerate(bin_data):
        print 'Byte {0} as binary: {1:08b}'.format(i,ord(c))
    

    输出

    bin_data length: 2
    Value from file: 824
    bin_data representation: '8\x03'
    Byte 0 as binary: 00111000
    Byte 1 as binary: 00000011
    

    【讨论】:

    • 但是,比如说 5,我可以用 1 个字节来表示它。在那种情况下,我不想要 2 个字节。解决方案是什么?我想使用最小字节数
    • 阅读结构文档。如果值适合一个字节,则使用 B 而不是 H。
    【解决方案2】:

    看看struct:

    >>> struct.pack("h", 824)
    '8\x03'
    

    【讨论】:

    • 能否请您详细说明以上内容。用一些代码说明如何将 824 转换为二进制格式并以“按位”方式写入文件
    • 即在文件中应该占2个字节,而不是3个
    【解决方案3】:

    我想你想要的是open二进制模式的文件:

    open("file.bla", "wb")
    

    但是,这会将一个整数写入文件,该文件的大小可能为 4 个字节。我不知道 Python 是否有 2 字节整数类型。但是您可以通过在一个 32 位数字中编码 2 个 16 位数字来规避这一点:

    a = 824
    b = 1234
    c = (a << 16) + b
    

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 2015-11-08
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多