美文网首页
python(处理二进制文件)

python(处理二进制文件)

作者: OldSix1987 | 来源:发表于2016-09-04 02:21 被阅读1763次

    案例


    分析一个wav文件的头部信息,处理音频数据。

    wav-sound-format[1].gif Paste_Image.png

    在Python3中,
    /除法,计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数;
    //除法,称为地板除,两个整数的除法仍然是整数; e.g.: a //= 2

    总结


    (1)wav头部信息长度44字节,含有声道数,采样频率,编码宽度
    (2)文件操作

    
    info = f.read(44)  # 只读头44个字节头部信息
    
    f.seek(0, 2)  # 将文件指针指向文件末尾方便计算文件的长度
    f.tell()   # 当前文件的位置
    f.readinto(buf)  # 将data读入到buf中,保存的是活生生的二进制的机器码
    f.write  # 写文件
    buf.tofile(f)  # 将buf中的二进制机器码写入到文件中
    

    (3)array和list

    代码


    import struct
    import array
    
    
    with open('demo.wav', 'rb') as f:
        info = f.read(44)
        # print(info[22:24])  # b'\x01\x00'
        v3 = struct.unpack('h', info[22:24])  # 音频文件的声道数
        v4 = struct.unpack('i', info[24:28])  # 音频文件的采用频率)
        v5 = struct.unpack('h', info[34:36])  # 音频文件的编码宽度
        # print(v3, v4, v5, sep="\n---\n")
    
        f.seek(0, 2)  # 文件指针指向文件末尾
        index = f.tell()  # 21740
        n = (f.tell() - 44) // 2  # wav音频文件44位往后才是音频的data部分
    
        buf = array.array('h', (0 for _ in range(n)))  # 初始化为0
        f.seek(44)  # 文件指针指向data开始的位置
        res = f.readinto(buf)  # 将data读入array中
    
        for i in range(n):
            buf[i] //= 4
    
        with open('demo2.wav', 'wb') as f2:
            f2.write(info)
            buf.tofile(f2)
    
    
    
    
    
    v = struct.unpack('h', b'\x01\x02')  # 513
    v2 = struct.unpack('>h', b'\x01\x02')  # 258
    # print(v)
    
    

    相关文章

      网友评论

          本文标题:python(处理二进制文件)

          本文链接:https://www.haomeiwen.com/subject/ifrlettx.html