在Python 2中使用带有numpy fromfile/tofile的新io类(将io类转换为文件对象)
函数在Python 2中使用带有numpy fromfile/tofile的新io类(将io类转换为文件对象),python,numpy,file-io,Python,Numpy,File Io,函数numpy.fromfile和ndarray.tofile除了接受文件名外,还接受文件对象。如果数据不在文件开头或有其他特殊要求,则使用文件对象非常重要 在内部,这些函数使用FILE*直接完成它们的工作 在Python 2中,他们使用PyFile\u AsFile来获取文件*。这意味着文件对象必须是真正的文件对象,而不是与其共享接口的对象(请参阅) 在Python3中,由于PyFile\u AsFile和file对象消失了,它们不得不求助于接受类似文件的对象,并将处理任何具有fileno、f
numpy.fromfile
和ndarray.tofile
除了接受文件名外,还接受文件对象。如果数据不在文件开头或有其他特殊要求,则使用文件对象非常重要
在内部,这些函数使用FILE*
直接完成它们的工作
在Python 2中,他们使用PyFile\u AsFile
来获取文件*
。这意味着文件对象必须是真正的文件
对象,而不是与其共享接口的对象(请参阅)
在Python3中,由于PyFile\u AsFile
和file
对象消失了,它们不得不求助于接受类似文件的对象,并将处理任何具有fileno
、flush
、tell
和seek
的对象(请参阅)
接下来的问题是,如何从文件/到文件
使用Python2和io
对象(假设它们实际支持fileno()
)获取。最好是numpy v1.7+
到目前为止,我的想法是:
- 使用
os.dup
、os.fdopen
等从io
对象创建新的文件
对象。然而,这也有一些问题,因为它需要特别关闭(比如在numpy的Python3 npy_PyFile_Dup2中),以防止Python的内部缓冲出现问题,而且我并不完全理解Python和底层文件*
句柄之间的所有交互。此外,这意味着需要调用一个特殊函数来关闭此特殊对象,并且需要将数据(如原始位置)传输到关闭函数
- 使用Cython从
io
类获取FILE*对象,并直接调用C函数/从FILE
/到FILE
创建一个备用文件。这就需要Cython并假设从io
类获取文件*
与上面相同,但使用ctypes
。有点难看,但不需要Cython
在这些方法中,哪一种是最好的方法?对于第一个问题,如何正确处理所有Python/底层文件IO问题?对于最后两个问题,如何正确地从io
类获取文件*