除文件名外,函数numpy.fromfile
和ndarray.tofile
还接受文件对象。如果数据不在文件的开头或存在其他特殊要求,则使用文件对象很重要。
在内部,这些功能使用FILE*
直接完成工作。
在Python 2中,他们使用PyFile_AsFile
来获取FILE*
。这意味着文件对象必须真正是file
对象,而不是与它共享接口的东西(参见the source of npy_PyFile_Dup2
)。
在Python 3中,由于PyFile_AsFile
和file
对象消失了,他们不得不求助于接受类似文件的对象,并且可以使用fileno
,{{1}的任何内容},flush
和tell
(请参阅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
?