2013-02-28 5 views
8

एक SVG फ़ाइल मूल रूप से XML फ़ाइल है इसलिए मैं एक जादू संख्या के रूप में स्ट्रिंग <?xml (या हेक्स प्रतिनिधित्व: '3c 3f 78 6d 6c') का उपयोग कर सकता हूं लेकिन ऐसा करने के लिए कुछ विरोधी कारण हैं यदि उदाहरण के लिए अतिरिक्त सफेद-जगहें हैं इस चेक को तोड़ सकता है।मैं कैसे कह सकता हूं कि एक जादू संख्या का उपयोग किए बिना एक फ़ाइल एसवीजी है?

अन्य छवियों की मुझे आवश्यकता है/जांच करने की उम्मीद है सभी बाइनरी हैं और जादू संख्याएं हैं। अंततः पाइथन का उपयोग करके विस्तार का उपयोग किए बिना फ़ाइल SVG प्रारूप है, तो मैं तेज़ी से जांच कैसे कर सकता हूं?

+0

फ़ाइल की शुरुआत बाइनरी के रूप में पढ़ने के बारे में - अगर आपको कोई जादू संख्या नहीं मिलती है, तो आप इसे पाठ के रूप में पढ़ते हैं और इसे अपने ज्ञात पाठ पैटर्न में मिलान करने का प्रयास करते हैं? – dmg

+0

@ डीजेवी उचित लगता है। और मैं नहीं देखता कि यह कैसे टूट सकता है। –

उत्तर

10

एक्सएमएल <?xml प्रीम्बल के साथ शुरू करने की आवश्यकता नहीं है, इसलिए उस उपसर्ग के लिए परीक्षण एक अच्छी पहचान तकनीक नहीं है - यह उल्लेख न करें कि यह प्रत्येक एक्सएमएल को एसवीजी के रूप में पहचान लेगा।

import xml.etree.cElementTree as et 

def is_svg(filename): 
    tag = None 
    with open(filename, "r") as f: 
     try: 
      for event, el in et.iterparse(f, ('start',)): 
       tag = el.tag 
       break 
     except et.ParseError: 
      pass 
    return tag == '{http://www.w3.org/2000/svg}svg' 

cElementTree का उपयोग सुनिश्चित करता है कि पता लगाने है: एक सभ्य का पता लगाने, और वास्तव में लागू करने के लिए आसान है, का परीक्षण करने के उस फ़ाइल अच्छी तरह से बनाई है एक्सएमएल कि svg शीर्ष स्तर के तत्व शामिल कोई वास्तविक XML पार्सर का उपयोग है expat के उपयोग के माध्यम से कुशल; timeit दिखाता है कि ~ 200μs में एक एसवीजी फ़ाइल और 35μs में एक गैर-एसवीजी पता चला था। iterparse एपीआई पार्सर को संपूर्ण तत्व आकार के बावजूद पूरे तत्व पेड़ (मॉड्यूल नाम के बावजूद) बनाने और दस्तावेज़ के प्रारंभिक भाग को पढ़ने के लिए सक्षम बनाता है।

+1

प्रश्न पढ़कर, बाइनरी जादू संख्याओं और एक्सएमएल के मिश्रण ने लाल चेतावनी को ट्रिगर किया। यह उत्तर स्पष्ट करता है कि एक बाइनरी प्रारूप को पार्स करने के लिए एक दृष्टिकोण की आवश्यकता होती है, और एक (टेक्स्ट-आधारित) एक्सएमएल पढ़ने के लिए पूरी तरह से अलग दृष्टिकोण की आवश्यकता होती है। – heltonbiker

+2

@heltonbiker बिल्कुल। जादू संख्याओं में उनके लिए एक चीज है: कच्चा प्रदर्शन। यही कारण है कि उत्तर में एक कोड नमूना शामिल है जो प्रस्तावित दृष्टिकोण के * कुशल * कार्यान्वयन को दर्शाता है। – user4815162342

+0

इसके अलावा, अगर मैं सही समझता हूं, तो एक बाइनरी फ़ाइल स्वाभाविक रूप से अनियंत्रित होती है, जैसे कि सादे-पाठ फ़ाइल। एक सादा पाठ में, फिर, हमें शेबैंग, डॉक्टरेट्स और अन्य शामिल करना चाहिए, जबकि बाइनरी को उन terse, गुप्त जादू संख्याओं की आवश्यकता है। मेरा मानना ​​है कि, इस अर्थ में, यह जादू-संख्या सामग्री फाइलों को डेटा संग्रहीत करने के लिए सबसे छोटे आकार के, कम-स्तर, "पुराने तरीके" की याद दिलाती है, जबकि कुछ और नाम देने के लिए एक्सएमएल और जेएसओएन अधिक आधुनिक हैं, मानव- फ़ाइलों को डेटा संग्रहीत करने के पठनीय, फुलाया और अनावश्यक तरीका। दोनों दृष्टिकोण एक से अधिक पहलू में भिन्न होते हैं। – heltonbiker

2

आप फ़ाइल की शुरुआत बाइनरी के रूप में पढ़ने की कोशिश कर सकते हैं - अगर आपको कोई जादू संख्या नहीं मिलती है, तो आप इसे एक टेक्स्ट फ़ाइल के रूप में पढ़ते हैं और अपनी इच्छानुसार किसी भी पाठ पैटर्न से मेल खाते हैं। या ठीक इसके विपरीत।

संबंधित मुद्दे

 संबंधित मुद्दे