【问题标题】:how to read a binary file into variables in python如何将二进制文件读入python中的变量
【发布时间】:2012-09-30 00:45:09
【问题描述】:

我正在处理来自大型模型的信息,这意味着我有很多带有两个浮点列(比如说 X 和 Y)的大型 ascii 文件。但是,每当我必须读取这些文件时,都需要很长时间,所以我想也许将它们转换为二进制文件会使读取过程更快。

我使用 uu.encode(ascii_file,binary_file) 命令将我的 asciifile 转换为二进制文件,效果很好(实际上,测试了解码部分,我恢复了相同的文件)。

我的问题是:有没有办法直接将二进制文件读入 python 并将数据放入两个变量(x 和 y)中?

谢谢!

【问题讨论】:

  • 如果您打算完全使用 Python 中的文件,请改用 cPickle 腌制模型数据,因为这是在 Python 中保存和加载数据的更快方法。
  • 另外,uu.encode 不会将任何内容编码为二进制;它实际上将二进制编码为ASCII。因此,在 Python 中加载 uuencoded 文本实际上会更慢,因为您必须解开 uuencoding,然后从解码文本中加载 ASCII 浮点数。

标签: python binary


【解决方案1】:

您没有指定浮点列在 Python 中的表示方式。 cPickle 模块是一个快速的通用解决方案,其缺点是它创建的文件只能从 Python 读取,并且永远不应允许它读取不受信任的数据(从网络接收)。它可能只适用于所有常规数据类型,包括 numpy 数组。

如果您可以使用 numpy 并将数据存储在 numpy 数组中,请查看 numpy.savenumpy.savetxt 以及相应的加载函数,它们应该提供优于手动提取数据的性能。

array.array 也有将数组数据写入文件的方法,缺点是数组数据以原生格式写入,无法从不同的架构中读取。

【讨论】:

  • 谢谢,numpy 是个好主意(真的很简单,加载时间只是过去的 10%!)
  • 不客气。我希望 numpy 在其他方面也能很好地为您服务。提取数据时要小心 - 从 numpy 数组创建单个 numpy 浮点数比从 Python 列表中获取浮点数对象要慢。用 numpy 循环结构做尽可能多的操作,你会没事的。另外,请随时接受答案。 :)
【解决方案2】:

查看 python 的struct module。它可能是您想要用来读取和写入数据的东西。

【讨论】:

    【解决方案3】:

    我建议不要使用建议的 struct 模块,如果您的模型只是浮点数/双精度数(坐标),您应该看到 the array module,必须比 struct 模块中的任何操作快得多。它的缺点是集合是同质的,您需要在奇数索引中具有第一个值,在偶数索引中具有第二个值,或者顺序。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多