在Python 2中使用带有numpy fromfile / tofile的新io类(将io类转换为文件对象)

时间:2015-05-26 18:56:36

标签: python numpy file-io

除文件名外,函数numpy.fromfilendarray.tofile还接受文件对象。如果数据不在文件的开头或存在其他特殊要求,则使用文件对象很重要。

在内部,这些功能使用FILE*直接完成工作。

在Python 2中,他们使用PyFile_AsFile来获取FILE*。这意味着文件对象必须真正是file对象,而不是与它共享接口的东西(参见the source of npy_PyFile_Dup2)。

在Python 3中,由于PyFile_AsFilefile对象消失了,他们不得不求助于接受类似文件的对象,并且可以使用fileno,{{1}的任何内容},flushtell(请参阅the alternate source of npy_PyFile_Dup2)。

问题是,如何让seek / fromfile使用tofile对象运行Python 2(假设它们实际上支持io)。最好是numpy v1.7 +。

到目前为止我的想法:

  • 使用fileno()os.dup和其他人从os.fdopen对象创建新的file对象。然而,这有一些问题需要特别关闭(比如在numpy的Python 3 npy_PyFile_Dup2中)以防止Python内部缓冲的问题,而且我不完全理解Python和底层{{1}之间的所有交互。处理。此外,这意味着需要调用特殊函数来关闭此特殊对象,并且需要将数据传输(如原始位置)到关闭函数。
  • 制作替代io / FILE*使用Cython从fromfile类中获取FILE *对象并直接调用C函数PyArray_FromFile / PyArray_ToFile 。这需要Cython,并假设从tofile类获得io
  • 与上述相同但使用FILE*。稍微丑陋但不需要Cython。

这些方法中,哪种方法最好?对于第一个,如何正确处理所有Python /底层文件IO问题?对于最后两个,如何正确地从io类中获取ctypes

0 个答案:

没有答案