2013-02-28 16 views
8

Eine SVG Datei ist im Grunde eine XML Datei, so könnte ich die Zeichenfolge <?xml (oder die Hexadezimaldarstellung: '3c 3f 78 6d 6c') als magische Zahl verwenden, aber es gibt ein paar entgegengesetzte Gründe, dies nicht zu tun, wenn es beispielsweise zusätzliche Leerzeichen gibt könnte diese Prüfung brechen.Wie kann ich sagen, dass eine Datei SVG ohne eine magische Zahl ist?

Die anderen Bilder, die ich überprüfen muss, sind alle Binärdateien und haben magische Zahlen. Wie kann ich schnell überprüfen, ob die Datei ein SVG Format ist, ohne die Erweiterung mit Python zu verwenden?

+0

Wie liest man den Anfang der Datei als Binärdatei - wenn Sie keine magischen Zahlen finden können, lesen Sie es als Text und versuchen Sie es mit Ihren bekannten Textmustern zu vergleichen? – dmg

+0

@DJV Klingt vernünftig. Und ich sehe nicht, wie es nicht brechen konnte. –

Antwort

10

XML ist nicht mit der <?xml Präambel beginnt erforderlich, so die Prüfung für diesen Präfix ist keine gute Erkennungstechnik - nicht zu erwähnen, dass es jedes XML als SVG identifizieren würde. Eine anständige Erkennung und einfach zu implementieren, ist einen echten XML-Parser zu verwenden, um zu testen, dass die Datei XML wohlgeformt, die das svg Element der oberste Ebene enthält:

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 stellt sicher verwenden, dass die Detektion effizient durch den Einsatz von Expat; timeit zeigt, dass eine SVG-Datei als solche in ~ 200μs und ein Nicht-SVG in 35μs erkannt wurde. Die API iterparse ermöglicht dem Parser, auf das Erstellen der gesamten Elementstruktur (ungeachtet des Modulnamens) zu verzichten und nur den Anfangsteil des Dokuments zu lesen, unabhängig von der Gesamtdateigröße.

+1

Durch das Lesen der Frage löste das Mischen von binären magischen Zahlen und XML einen roten Alarm aus. Diese Antwort macht deutlich, dass das Parsen eines Binärformats einen Ansatz erfordert, und das Lesen eines (textbasierten) XML-Codes erfordert einen VOLLSTÄNDIG VERSCHIEDENEN Ansatz. – heltonbiker

+2

@heltonbiker Genau. Für magische Zahlen gibt es eine Sache: rohe Leistung. Aus diesem Grund enthält die Antwort ein Codebeispiel, das eine * effiziente * Umsetzung des vorgeschlagenen Ansatzes demonstriert. – user4815162342

+0

Auch, wenn ich richtig verstehe, ist eine Binärdatei von Natur aus unstrukturiert, z. B. eine Nur-Text-Datei. In einem Klartext sollten wir dann Shebangs, Doctypes und so weiter einschließen, während Binary diese knappen, kryptischen magischen Zahlen benötigt. Ich glaube in diesem Sinne, dass diese magischen Zahlen an die kleinstmögliche, niedrigstufige, "alte Art" erinnern, Daten in Dateien zu speichern, während XML und JSON, um nur einige zu nennen, moderner, menschlicher sind. lesbare, überhöhte und redundante Möglichkeit zum Speichern von Daten in Dateien. Beide Ansätze unterscheiden sich dann in mehr als einem Aspekt. – heltonbiker

2

Sie können versuchen, den Anfang der Datei als Binärdatei zu lesen - wenn Sie keine magischen Zahlen finden können, lesen Sie sie als Textdatei und passen sie zu beliebigen Textmustern an. Oder umgekehrt.