2013-01-29 4 views
0

나는 이것에 대해 꽤 많은 게시물을 살펴 보았습니다. 나는 다른 언어를 사용했지만 파이썬을 배우고 있으며 수업에도 익숙하지 않아서 수업이 어떻게 작동하는지 이해하지 못한다고 생각합니다.TypeError : 시퀀스가 ​​아닌 순서로 반복

나는 앱을 읽고있는 epub에서 일하고 싶었고 integrate라고하는 roberto alasina의 프로젝트를 발견 했으므로 좋은 출발점 이었지만 메타 데이터를 수집하지 못했고 epub 처리 라이브러리가 다른 것들을 충분히 추출하지 못했습니다 나하고 싶어. 그래서 나는 epub 독서 수업 인 dustjacket을 발견했다.

내가 이것을 더 추출해야하는 이유는 독자가 아니라 앱의 여러 부분에서 데이터를 읽는 것을 처리해야하기 때문입니다. 나는 검색을 가능하게하기 위해 그것에 whoosh를 추가 할 계획이며 장을 읽고 색인을 생성 할 필요가있다. 도서 가져 오기 중에이 작업을 수행 할 수 있으며 실제로 색인 생성 부분에 GUI가 필요하지 않습니다.

은 어쨌든 DIST 재킷 내가 로깅을 추가하고 내 방법을 제대로 EPUB에서 목차를 잡는 것을 볼 수 있습니다 : 내가 디버그 로그에 넣고

def __parse_oebps(self, epub): 
    '''Construct the chapter list assuming that the ePub has files in OEBPS/.''' 

    # Parse the chapters 
    npoints = self.__toc.findall("//{%(tocns)s}navPoint" % {'tocns': self.__namespaces['ncx']}) 
    for p in npoints:     
     #rt = p.getroottree() 
     #title = p.findtext("{%(tocns)s}text" % {'tocns': self.__namespaces['ncx']}) # Label text   
     title = p.find(
      '{http://www.daisy.org/z3986/2005/ncx/}navLabel').find(
       '{http://www.daisy.org/z3986/2005/ncx/}text').text 
     contentfile = p.find("{%(tocns)s}content[@src]" % {'tocns':self.__namespaces['ncx']}).attrib['src'] # Contentfile name 
     #if self.__has_oebps: 
     # #contentfile = "OEBPS/" + contentfile 
     # contentfile = "OEBPS/" + contentfile 
     # log.info("content file: %s", contentfile) 

     #return contentfile 
     #self.chapters.append(EpubChapter(epub, p.attrib['id'], p.attrib['playOrder'], contentfile, title)) 
     if title and contentfile: 
      log.debug("Title:  %s", title) 
      log.debug("content file: %s", contentfile) 
      self.chapters.append([title, contentfile]) 

    return self.chapters 

쉽게 예를 볼 수 있습니다 클래스에서 제대로 호출되었으며 title과 contentfile이 있습니다. 이것은 ebubtoc 클래스에서이며, EPUB 클래스에서이 메서드에서 호출됩니다

for l, c in self.__toc: 
TypeError: iteration over non-sequence 

나는 아무 생각에서이 없다 :이 오류가 발생하는 경우

def __read_toc(self): 
    '''Construct the table of contents for this epub''' 
    self.__toc = EpubToc(self) 
    for l, c in self.__toc: 
     log.debug("Title:  %s", l) 
     log.debug("content file: %s", c) 

이 방법은 데이터를 가져 지금 이 점은 내가 뭘 잘못하고 왜이 작동하지 않습니다. 이것이 충분하지 않다면 나는 사용하고있는 나머지 클래스를 게시 할 수있다.

for l, c in self.__toc: 

그러나 자기 .__ TOC를 선언했다 :

감사

+2

당신이 아니라 마지막 두 줄을 전체 역 추적을 게시 할 수 있습니다 (예를 들어, 가능한 압축 기능)은 사용자의 특정 요구에 맞게 작동하도록하기 위해 미세 조정의 조금을해야 할 수도 있습니다, 작동합니다 ? –

+0

for 루프 바로 앞에'print (self .__ toc)'를 써서 출력 할 수 있습니까? – PearsonArtPhoto

+0

__toc = 클래스 상단에서 아무 것도 반환하지 않습니다. print 문은 반환하지 않습니다. 맨 위에서 __toc = []을 시도했지만 여전히 동일한 문제가 발생했습니다. – webmedic

답변

0

문제는, 당신이 보여,이 라인

결론은

self.__toc = EpubToc(self) 
을 수행해야 객체가 아닌 목록을 반복합니다. 이런 식으로 뭔가 당신이

for c in self.__toc.get_chapter_titles(): 
+0

빠른 테스트를 기반으로해서 'self .__ toc' 커스텀 (구식) 클래스입니다. OP의 정확한 역 추적 메시지를 얻을 수있는 유일한 방법입니다. – mgilson

+0

정확하게 여기에 대해 언급하지는 않았지만 위의 게시물에서 정확히 무엇이 반환되는지 확인할 수 있습니다. self.chapters.append ([title, contentfile]) – webmedic