XML은 <?xml
전문으로 시작해야하는 것은 아니므로 해당 접두사를 테스트하는 것은 좋은 탐지 기술이 아니며 모든 XML을 SVG로 식별한다는 것은 말할 필요도 없습니다.
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
을 사용하여 검출이 보장 : 괜찮은 감지하고, 구현하기가 정말 쉽습니다, 파일이 svg
최상위 요소가 포함 된 XML을 잘 형성하는지 테스트하기 위해 실제 XML 파서를 사용하는 것입니다 expat의 사용을 통해 효율적인; timeit
은 ~ 200μs에서 SVG 파일이 감지되었고 35μs에서 SVG가 아닌 것으로 나타났습니다. iterparse
API를 사용하면 파서는 전체 파일 크기에 관계없이 전체 요소 트리 (모듈 이름에도 불구하고)를 작성하지 않고 문서의 처음 부분 만 읽을 수 있습니다.
파일의 시작 부분을 바이너리로 읽는 방법 - 매직 번호를 찾을 수 없다면 텍스트로 읽고이를 알려진 텍스트 패턴과 비교해보십시오. – dmg
@DJV 합리적이라고 생각합니다. 그리고 어떻게 깨질 수 있는지 보지 못합니다. –