2009-10-02 7 views
5

* 구조화 된 마크 업 데이터의 큰 파일 (> 5GB)을 구문 분석하려고합니다. 데이터 형식은 기본적으로 XML이지만 명시 적 루트 요소는 없습니다. 가장 효율적인 방법은 무엇입니까?파이썬에서 큰 pseudo-xml 파일 구문 분석

SAX 파서의 문제점은 루트 요소가 필요하다는 것입니다. 그래서 데이터 스트림에 의사 요소를 추가해야합니다 (파이썬에서 Java의 SequenceInputStream에 해당합니까?) 또는 SAX가 아닌 이벤트 기반 파서를 준수합니다 (sgmllib의 후속 버전이 있습니까?)

데이터 구조가 매우 간단합니다. 요소의 기본적 목록 :

<Document> 
    <docid>1</docid> 
    <text>foo</text> 
</Document> 
<Document> 
    <docid>2</docid> 
    <text>bar</text> 
</Document> 

이 * 실제로 당신이 xml.sax.parse에 '스트림'개체를 전달할 수 있다는

답변

11

http://docs.python.org/library/xml.sax.html

주를 반복합니다. 즉, parse 호출에 파일과 같은 메소드 (예 : read)가있는 객체를 전달할 수 있음을 의미합니다. 먼저 가상 루트 시작 태그를 놓은 다음 자신의 객체를 만든 다음 파일의 내용을 만든 다음 가상 루트 종료 태그. 나는 당신이 단지 read 방법을 구현할 필요가 있다고 생각합니다 ... 그러나 이것은 당신이 사용할 색소 파서에 달려 있습니다. 나를 위해 작동

예 :

import xml.sax 
import xml.sax.handler 

class PseudoStream(object): 
    def read_iterator(self): 
     yield '<foo>' 
     yield '<bar>' 
     for line in open('test.xml'): 
      yield line 
     yield '</bar>' 
     yield '</foo>' 

    def __init__(self): 
     self.ri = self.read_iterator() 

    def read(self, *foo): 
     try: 
      return self.ri.next() 
     except StopIteration: 
      return '' 

class SAXHandler(xml.sax.handler.ContentHandler): 
    def startElement(self, name, attrs): 
     print name, attrs 

d = xml.sax.parse(PseudoStream(), SAXHandler()) 
+0

인가? 그 코드의 클라이언트가'read()'만을 사용했다면 EOF를 어떻게 알 수 있습니까? –

+4

파이썬에서 스트림과 같은 객체의 속성 중 하나는 read() 호출이 적어도 하나의 바이트를 차단하고 반환하거나 EOF의 경우 빈 문자열을 반환한다는 것입니다. 이것이 원래의 file.read 메소드가 작동하는 방식입니다. – liori

+1

PullDOM과 함께 사용하는 것이 좋습니다. SAX의 스트리밍 특성과 DOM의 계층 적 특성을 결합합니다. – RichieHindle

1

가 신속하고 더러운 답변 (String로서) 루트 요소를 추가하는 것입니다 그래서 유효한 XML 될 것이다.

감사합니다.

1

추가 루트 요소 및 SAX, STAX 또는 VTD-XML을 사용 ..

+0

Mr. Zhang - 좋은 답변입니다. 나는 그것을 upvoted했습니다. –

+0

메타 계좌를이 계좌와 연결했는데 약속 한 100 점은 어디에 있습니까? –

0

xml.parsers.expat - 국외 거주자 xml.parsers.expat 모듈을 사용하여 빠른 XML 파싱은 국외 거주자 비에 파이썬 인터페이스이다 유효성을 검사하는 XML 파서. 이 모듈은 XML 파서의 현재 상태를 나타내는 단일 확장 유형 인 xmlparser를 제공합니다. xmlparser 객체가 만들어지면 객체의 다양한 속성을 핸들러 함수로 설정할 수 있습니다. 그런 다음 XML 문서가 파서에 공급되면 XML 문서의 문자 데이터와 마크 업에 대한 핸들러 함수가 호출됩니다.

더 많은 정보를 원하시면 : 정말 옳은 일 StopIteration``에 할 수있는``반환 ''http://www.python.org/doc/2.5/lib/module-xml.parsers.expat.html