शायद एक बेहतर उत्तर है ... लेकिन जब मुझे इस समस्या का सामना करना पड़ा, तो मेरी एक फाइल थी जिसे मैं अलग से अलग-अलग हिस्सों तक पहुंचाना चाहता था, जिसने मुझे इस समस्या का आसान समाधान दिया।
उदाहरण के लिए, 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
मॉड्यूल, या जो कुछ भी का उपयोग करके आप एक बार आप read
डेटा करना चाहते हैं। लेकिन, यदि आप पसंद करते हैं, आप स्पष्ट रूप से seek
और read
f
से m
निर्माण करने से पहले या बाद में, या यहाँ तक कि एक ही कॉल 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.array
के बजाय numpy.memmap
के रूप में छोड़ने का विकल्प भी देगा, जो numpy
को पेजिंग आदि पर अधिक नियंत्रण/प्रतिक्रिया देता है, लेकिन numpy.memmap
और mmap
प्राप्त करना वास्तव में बहुत मुश्किल है एक साथ काम करने के लिए।)
डैंग, फ़ाइल नाम के बजाय फ़ाइल ऑब्जेक्ट! यह वही है जो मैं ढूंढ रहा हूं, इसे दस्तावेज में जोड़ा जाना चाहिए ... धन्यवाद! – brorfred