14

SVGファイルは基本的にファイルでXMLあるため、文字列<?xml(または 16 進数表現: '3c 3f 78 6d 6c') をマジック ナンバーとして使用できますが、たとえば余分な空白がある場合、このチェックを破る可能性がある場合、それを行わない理由がいくつかあります。

私がチェックする必要がある/期待する他の画像はすべてバイナリであり、マジックナンバーを持っています。SVG最終的にPythonを使用して、拡張子を使用せずにファイルがフォーマットであるかどうかをすばやく確認するにはどうすればよいですか?

4

3 に答える 3

15

XML は<?xmlプリアンブルで開始する必要がないため、そのプレフィックスをテストすることは適切な検出手法ではありません。もちろん、すべての XML が SVG として識別されることは言うまでもありません。実際の XML パーサーを使用して、ファイルがsvg最上位の要素を含む整形式の 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'

を使用すると、 expatcElementTreeを使用して検出が効率的になります。SVG ファイルは約 200μs で検出され、非 SVG ファイルは 35μs で検出されたことを示しています。API を使用すると、パーサーは要素ツリー全体 (モジュール名に関係なく) を作成せずに、ファイルの合計サイズに関係なく、ドキュメントの最初の部分のみを読み取ることができます。timeititerparse

于 2013-02-28T13:22:58.493 に答える
2

ファイルの先頭をバイナリとして読み取ってみてください。マジック ナンバーが見つからない場合は、テキスト ファイルとして読み取って、必要なテキスト パターンに一致させます。またはその逆。

于 2013-02-28T13:14:18.300 に答える