如何在不使用幻数的情况下将文件称为SVG?

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'
Run Code Online (Sandbox Code Playgroud)

使用cElementTree确保通过使用expat有效检测; timeit表明在约200μs内检测到SVG文件,在35μs内检测到非SVG.该iterparseAPI使解析器放弃创建整个元素树(模块名称尽管)和只读文件的初始部分,而不管总文件大小的.

  • 通过阅读问题,二进制幻数和XML的混合触发了红色警报.这个答案清楚地表明,解析二进制格式需要一种方法,并且读取(基于文本的)XML需要一种完全不同的方法. (2认同)
  • @heltonbiker完全正确.魔术数字确实有一件事要做:原始表现.这就是为什么答案包括一个代码示例,它演示了所提出方法的*高效*实现. (2认同)