2010-04-23 11 views
6

में एक डेल्फी बाइनरी फ़ाइल पढ़ना मैं एक फ़ाइल है जो निम्न डेल्फी घोषणा के साथ लिखा गया था ...अजगर


Type 
    Tfulldata = Record 
    dpoints, dloops : integer; 
    dtime, bT, sT, hI, LI : real; 
    tm : real; 
    data : array[1..armax] Of Real; 
    End; 

... 
Var: 
    fh: File Of Tfulldata; 

है मैं फ़ाइलों में डेटा (आकार में कई एमबी) यदि अजगर का उपयोग कर विश्लेषण करना चाहते हैं संभव - क्या डेटा में पढ़ने और डेटा को पाइथन ऑब्जेक्ट्स में डेल्फी रिकॉर्ड के समान रूप में डालने का एक आसान तरीका है? क्या किसी को पुस्तकालय के बारे में पता है शायद यह करता है?

यह, निम्न विकल्पों में जो (या नहीं हो सकता) उचित हो सकता है के साथ डेल्फी 7 पर संकलित किया गया है

  • रिकार्ड फील्ड संरेखण: 8
  • पेंटियम सुरक्षित FDIV: गलत
  • ढेर फ्रेम्स: झूठे
  • अनुकूलन: यह सच है
+1

एक बात आप पता लगाने के लिए की जरूरत है क्या 'Real' समय डेल्फी कोड संकलित किया गया था पर मतलब है। नए कोड में, यह 'डबल', सामान्य आईईईई 64-बिट फ्लोटिंग-पॉइंट नंबर के लिए उपनाम है। पुराने डेल्फी संस्करणों में, यह क्या आजकल 'Real48', जो मैं कहीं और लागू किया कभी नहीं देखा है के रूप में जाना जाता है (हालांकि वहाँ सी # में' double' करने के लिए उन 6-बाइट प्रकार परिवर्तित करने के बारे में स्टैक ओवरफ़्लो पर यहां सवाल के एक जोड़े थे, जो आपके अपने प्रयास में उपयोगी हो सकता है)। –

+1

क्या आप जानते हैं कि किस डेल्फी संस्करण को संकलित किया गया था? – PhiS

+0

कोड डेल्फी 7 – Brendan

उत्तर

5

यहाँ KillianDS और Ritsaert Hornstra से संकेत करने के लिए पूर्ण समाधान धन्यवाद

import struct 
fh = open('my_file.dat', 'rb') 
s = fh.read(40256) 
vals = struct.unpack('iidddddd5025d', s) 
dpoints, dloops, dtime, bT, sT, hI, LI, tm = vals[:8] 
data = vals[8:]
+1

यदि armax = 5024 तो ऐसा लगता है कि आपके पास एक-एक-एक त्रुटि है। शायद एक टाइपो था और आपका मतलब 5025 था? –

+0

हाँ यह सही है, armax = 5025, मैं स्मृति से काम कर रहा था और मैंने हाल ही में मूल्य समायोजित किया था ताकि डेटा सरणी शून्य अनुक्रमित हो और उलझन में हो - मुझे यह परेशान लगता है कि डेल्फी में गतिशील/खुले सरणी शून्य अनुक्रमित हैं, फिर भी कई फ़ंक्शन (यानी कॉपी()) एक से शुरू होता है ... – Brendan

+0

गतिशील सरणी शून्य से शुरू होती है, केवल स्ट्रिंग डिफ़ॉल्ट रूप से 1 से शुरू होती है (ऐतिहासिक कारणों से)। जब आप स्वयं को एक सरणी परिभाषित करते हैं तो उन ऑफ़सेट का उपयोग हर जगह किया जाता है। –

2

मैं नहीं जानता कि कैसे डेल्फी आंतरिक भंडार डेटा, लेकिन के रूप में सरल यह है अगर बाइट वार डेटा (इसलिए धारावाहिक और उलझन में नहीं), struct का उपयोग करें। इस तरह आप एक पाइथन फ़ाइल से बाइनरी डेटा के रूप में एक स्ट्रिंग का इलाज कर सकते हैं। साथ ही, बाइनरी file(open,'rb') के रूप में फ़ाइलें खोलें।

2

कृपया ध्यान दें कि जब आप डेल्फी (सी में संरचना की तरह) में एक रिकॉर्ड को परिभाषित करते हैं तो फ़ील्ड क्रमबद्ध होते हैं और बाइनरी में वर्तमान संरेखण दिया जाता है (उदाहरण के लिए बाइट्स को 1 बाइट सीमाओं पर गठबंधन किया जाता है, 2 बाइट, इंटीग्रर्स पर शब्द 4 बाइट इत्यादि पर, लेकिन यह कंपाइलर सेटिंग्स को अलग-अलग हो सकता है।

जब फ़ाइल में क्रमबद्ध किया जाता है, तो संभवतः आप का मतलब है कि यह रिकॉर्ड फ़ाइल में बाइनरी में लिखा गया है और अगला रिकॉर्ड स्थिति में शुरू होने वाले पहले के बाद लिखा गया है आकार (संरचना) इत्यादि। डेल्फी निर्दिष्ट नहीं करता है कि फाइल को फ़ाइल से/से क्रमबद्ध कैसे किया जाना चाहिए, इसलिए आपके द्वारा दी जाने वाली जानकारी हमें अनुमान लगाती है।

यदि आप यह सुनिश्चित करना चाहते हैं कि यह हमेशा एक ही w किसी भी कंपाइलर सेटिंग के हस्तक्षेप के बिना, पैक किए गए रिकॉर्ड का उपयोग करें।

रियल के कई अर्थ हो सकते हैं (यह पुराने डेल्फी संस्करणों के लिए 48 बिट फ्लोट प्रकार है और बाद में 64 बिट फ्लोट (आईईईई डबल) पर)।

यदि आप डेल्फी कोड तक नहीं पहुंच सकते हैं या इसे स्वयं संकलित नहीं कर सकते हैं, तो केवल एक हेक्स संपादक के साथ डेटा जांचने के लिए टाइप करें, आपको रिकॉर्ड्स की सीमाओं को स्पष्ट रूप से देखना चाहिए क्योंकि वे इंटीग्रर्स से शुरू होते हैं और केवल फ़्लोट का पालन करते हैं।

+0

में संकलित किया गया एक ध्यान दें: चूंकि संरचना के अंत में एक सरणी प्रकार है, सरणी चर आकार –

+0

मैं कोड है कि दोनों पढ़ता है और डेटा लिखते हैं की पहुंच है ऐसा हो सकता है - ऐसा लगता है कि कोड में ही एकमात्र प्रासंगिक रेखाएं प्रश्न में हैं। मैंने कुछ विकल्प निर्दिष्ट किए हैं जो महत्वपूर्ण लगते हैं।मैंने एक हेक्स संपादक में भी देखा, हालांकि यह मेरे लिए अपरिचित क्षेत्र है - '00' वर्णों के बड़े ब्लॉक से अलग यादृच्छिक वर्ण हैं ... – Brendan

+0

इसके अलावा सरणी आकार निरंतर - armax = 5024 – Brendan