2013-07-08 1 views
0

나는 각 Next() 호출시 임의의 양의 텍스트 (문자열)를받는 생성기를 반환하는 네트워크 라이브러리를 사용하고 있습니다. 여기서 모든 Next() 호출의 결과를 간단하게 연결 한 경우 표준 영어 텍스트 문서처럼 보일 것입니다.텍스트 스트림을 줄 스트림으로 변환하는 생성기가 있습니까?

각 Next() 호출에서 반환 된 문자열에 여러 줄 바꿈이있을 수 있으며 아무 것도 없을 수 있습니다. 반환 된 문자열이 반드시 개행에서 끝나는 것은 아닙니다. 즉, 한 줄의 텍스트가 여러 Next() 호출에 분산 될 수 있습니다.

한 줄의 텍스트를 반환하려면 Next()가 필요한 두 번째 라이브러리에서이 데이터를 사용하려고합니다. 전체 스트림에서 읽지 않는 것이 절대적으로 중요합니다. 이것은 수십 기가 바이트의 데이터 일 수 있습니다.

이 문제를 해결할 수있는 기본 제공 라이브러리가 있습니까? 그렇지 않다면 문제를 해결하기 위해 발전기 또는 다른 방법을 쓰는 가장 좋은 방법을 제안 할 수 있습니까?

+0

들어오는 텍스트의 구조에 대해 알지 못하는 경우 대답하기가 어렵습니다. 질문에 더 추가하십시오 – inspectorG4dget

+0

텍스트 구조가 실제로 중요합니까? 그 안에 개조 문자가 들어간 텍스트 데이터입니다. 생성기가 문자열을 반환하고 있습니다. – Chuu

+0

'for line in stream.split ('\ n')을 사용하여 직접 빌드 할 수 있습니까? yield line'? – wflynny

답변

2

청크를 끌어내어 줄로 나누는 생성기 함수를 작성하십시오. 마지막 줄이 개행 문자로 끝났는지 알지 못하기 때문에 그것을 저장하고 다음 덩어리에 붙이십시오.

def split_by_lines(text_generator): 
    last_line = "" 
    try: 
     while True: 
      chunk = "".join(last_line, next(text_generator)) 
      chunk_by_line = chunk.split('\n') 
      last_line = chunk_by_line.pop() 
      for line in chunk_by_line: 
       yield line 
    except StopIteration: # the other end of the pipe is empty 
     yield last_line 
     raise StopIteration 
+0

Python 2.4에서는 .join과 next (...)의 오버로드가 아직 존재하지 않기 때문에 약간의 변경이 필요합니다. – Chuu

0

편집을 읽은 후 임의의 양의 텍스트를 반환하는 스트림 객체를 수정할 수 있습니까? 예를 들어, stream.next() 메서드에서는 문자열이 문자열을 생성하는 몇 가지 방법이 있으며 .next()을 호출하면 yields이됩니다. 당신은 같은 것을 할 수 없습니다 :

def next(self): 
    if '\n' in self.remaining: 
     terms = self.remaining.split('\n') 
     to_yield, self.remaining = terms[0], ''.join(terms[1:]) 
     yield to_yield 
    else: 
     to_yield = self.remaining + self.generate_arbitrary_string() 
     while '\n' not in to_yield: 
      to_yield += self.generate_arbitrary_string() 
     to_yield, self.remaining = terms[0], ''.join(terms[1:]) 
     yield to_yield   

를이 의사 스트림 객체가 generate_arbitrary_string() 일부 임의의 문자열을 생성한다고 가정합니다. next()의 첫 번째 호출에서 self.remaining 문자열은 비어 있어야하므로 else 문으로 이동하십시오. 여기서, newline 문자를 찾을 때까지 임의의 문자열을 연결하고, 연결된 문자열을 첫 번째 newline 문자로 분할하여 전반을 산출하고 두 번째 절반을 remaining에 저장합니다.

이어서 next()이 호출 될 때 self.remainingnewline 문자가 포함되어 있는지 먼저 확인하십시오. 그렇다면 첫 번째 줄을 만들어 나머지는 저장하십시오. 그렇지 않으면 self.remaining에 새로운 임의의 문자열을 추가하고 위와 같이 계속하십시오.