有可能是一个更好的答案......但是当我面对这个问题时,我有一个文件,我已经想要分别访问不同的部分,这给我一个简单的解决这个问题。
例如,说chunkyfoo.bin
是由6字节的标题,1024字节的numpy
数组和另一个1024字节的numpy
数组组成的文件。你不能只打开文件并寻找6个字节(因为numpy.fromfile
所做的第一件事是lseek
回到0)。但是你可以mmap
的文件,并使用fromstring
代替:
with open('chunkyfoo.bin', 'rb') as f:
with closing(mmap.mmap(f.fileno(), length=0, access=mmap.ACCESS_READ)) as m:
a1 = np.fromstring(m[6:1030])
a2 = np.fromstring(m[1030:])
这听起来像你想要做什么。当然,除了在现实生活中,到a1
和a2
的偏移和长度可能取决于头部,而不是固定的评论。
标题仅为m[:6]
,您可以通过明确地将其分开,使用struct
模块或其他数据解析该数据。但是,如果您愿意的话,您可以在构建m
之前或之后明确seek
和read
,从f
或之后,甚至在m
上进行相同的呼叫,并且它将起作用,而不会影响a1
和a2
。
的替代,我已经对不同的非numpy
- 相关项目的完成,是创建一个封装文件的对象,像这样:
class SeekedFileWrapper(object):
def __init__(self, fileobj):
self.fileobj = fileobj
self.offset = fileobj.tell()
def seek(self, offset, whence=0):
if whence == 0:
offset += self.offset
return self.fileobj.seek(offset, whence)
# ... delegate everything else unchanged
我做的是“委托其他一切不变”在施工时产生一个list
属性,并在__getattr__
中使用这个属性,但是你可能想要的东西不那么黑。 numpy
只依赖类似文件对象的一些方法,并且我认为它们被正确记录,所以只需明确地委托它们。但我认为mmap
解决方案在这里更有意义,除非您试图通过机械方式将一系列明确的基于seek
的代码移植到此处。 (你会认为mmap
也会让你选择将它作为numpy.memmap
而不是numpy.array
,这让numpy
有更多的控制/来自分页等的反馈。但是实际上得到一个numpy.memmap
和一个mmap
一起工作。)
Dang,文件对象而不是文件名!这正是我正在寻找的,这应该被添加到从文件的文件...谢谢! – brorfred