Edu*_*scu 9 python xml svg file-format magic-numbers
一个SVG文件基本上是一个XML文件,所以我可以使用字符串<?xml(或十六进制表示:) '3c 3f 78 6d 6c'作为一个幻数,但有一些相反的理由不这样做,如果例如有额外的空格,它可以打破这个检查.
我需要/期望检查的其他图像都是二进制文件并且具有幻数.如何在SVG不使用最终使用Python的扩展名的情况下快速检查文件是否为格式?
use*_*342 12
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'
使用cElementTree确保通过使用expat有效检测; timeit表明在约200μs内检测到SVG文件,在35μs内检测到非SVG.该iterparseAPI使解析器放弃创建整个元素树(模块名称尽管)和只读文件的初始部分,而不管总文件大小的.