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 を使用すると、パーサーは要素ツリー全体 (モジュール名に関係なく) を作成せずに、ファイルの合計サイズに関係なく、ドキュメントの最初の部分のみを読み取ることができます。timeit
iterparse