【问题标题】:How can I read and write binary files?如何读写二进制文件?
【发布时间】:2012-11-04 17:12:17
【问题描述】:

在接下来的几天里,我无法使用 PC,但我无法忘记这个问题。我只是在玩压缩算法,为音频创建了我自己的一个,我被困在输出到文件的步骤中。所以这是我的问题,希望我能在回来之前找到答案,否则这会让我大吃一惊。

1) 如果我有一个带有一些整数的 numpy X 数组(比如 int16),如果我打开一个文件对象并执行 file.write(X) 文件输出会是什么样子?数字?还是数字的ASCII?还是二进制?

2)根据上面的答案,我如何将这个文件读入一个numpy数组X?

基本上我的压缩做了一些小波和fft变换,在这里和那里做一些过滤并返回一个带有一些数字的数组,我知道这个数组的格式并且我已经在这里实现了很高的压缩百分比,下一步是首先将该数组转储到二进制文件中。一旦我实现了这一点,我的下一个目标就是实现文件/向量的某种熵编码。

任何意见表示赞赏。

【问题讨论】:

    标签: python numpy binary binaryfiles


    【解决方案1】:

    1) 写作:

    In [1]: f = open('ints','wb')
    In [2]: x = numpy.int16(array([1,2,3]))
    Out[2]: array([1, 2, 3], dtype=int16)
    In [3]: f.write(x)
    In [4]: f.close()
    

    2) 阅读:

    In [5]: f = open('ints','wb')
    In [6]: x = f.read()
    In [7]: x
    Out[7]: '\x01\x00\x02\x00\x03\x00'
    In [8]: numpy.fromstring(x, dtype=np.uint16, count=3)
    Out[8]: array([1, 2, 3], dtype=uint16)
    

    更新:

    正如 J.F.Sebastian 所建议的,有更好的方法可以做到这一点,比如使用:

    或如 Janne Karila 建议的那样使用:

    【讨论】:

    • 文件中有numpy.save、.savez等存储元数据
    • @J.F.Sebastian 是的,但问题是指file.write(X),不过是个好建议
    • 谢谢,这似乎有效。如果有人设法阅读此评论,当我执行 f=open(...) 时,我是否将内存中文件的全部内容都指向 f?还是我只将它链接到某个文件对象并且(我怀疑)在我实际执行“for line in f: ....”之类的操作之前,这些内容不会被加载到内存中?
    • 仅当您调用f.read() 并将其输出(对象)分配给某个目标(名称)时才会加载文件内容。如果您使用for line in f 进行迭代,一次只加载一段文件(行)。
    猜你喜欢
    • 2012-01-26
    • 2018-07-26
    • 2016-06-14
    • 2021-06-03
    • 2019-04-20
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多