2013-02-28 3 views
8

SVG 파일은 기본적으로 XML 파일이므로 <?xml (또는 16 진수 표현 : '3c 3f 78 6d 6c')을 마법 번호로 사용할 수 있지만 예를 들어 여분의 공백이 있으면 그 반대의 이유가 있습니다 이 수표를 깰 수 있습니다.매직 넘버를 사용하지 않고 파일이 SVG라고 어떻게 말할 수 있습니까?

확인해야 할 다른 이미지는 모두 바이너리이며 마법의 숫자입니다. 파이썬을 사용하여 확장자를 사용하지 않고 파일이 SVG 형식인지 빨리 확인하려면 어떻게해야합니까?

+0

파일의 시작 부분을 바이너리로 읽는 방법 - 매직 번호를 찾을 수 없다면 텍스트로 읽고이를 알려진 텍스트 패턴과 비교해보십시오. – dmg

+0

@DJV 합리적이라고 생각합니다. 그리고 어떻게 깨질 수 있는지 보지 못합니다. –

답변

10

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를 사용하면 파서는 전체 파일 크기에 관계없이 전체 요소 트리 (모듈 이름에도 불구하고)를 작성하지 않고 문서의 처음 부분 만 읽을 수 있습니다.

+1

질문을 읽으면 바이너리 매직 넘버와 XML이 섞여서 경고가 나타납니다. 이 대답은 바이너리 형식을 구문 분석하는 데 하나의 접근 방식이 필요하다는 것을 분명히하고 있으며 (텍스트 기반) XML을 읽으려면 완전히 다른 접근 방식이 필요합니다. – heltonbiker

+2

@heltonbiker 정확 하 게. 매직 번호는 원시적 인 성능을 발휘합니다. 이것이 답변에 제안 된 접근 방식의 * 효율적인 * 구현을 보여주는 코드 샘플이 포함 된 이유입니다. – user4815162342

+0

또한, 만약 내가 understant 권리, 바이너리 파일은 본질적으로 일반 텍스트 파일과 같은 비정형이다. 평범한 텍스트에서, 우리는 속임수, doctypes 등을 포함해야하며, 바이너리는 간결하고 비밀스러운 매직 넘버를 필요로합니다. 이런 의미에서이 마법의 숫자는 파일에 데이터를 저장하는 가장 작은 크기의 가능한 저수준 "옛 방식"을 연상케하는 반면, XML 및 JSON은 좀 더 현대적이고 인간 중심의 방식으로, 파일에 데이터를 저장하는 읽기 쉽고, 확장 된 중복 방법. 두 접근법은 둘 이상의 측면에서 서로 다릅니다. – heltonbiker

2

파일의 시작 부분을 바이너리로 읽을 수 있습니다. 마법 번호를 찾을 수 없으면 텍스트 파일로 읽고 원하는 텍스트 패턴과 일치시킵니다. 혹은 그 반대로도.

관련 문제