복붙노트

[PYTHON] iterable을 스트림으로 변환하는 방법?

PYTHON

iterable을 스트림으로 변환하는 방법?

문자열을 포함하는 iterable이 있다면 그것을 스트림으로 변환하는 간단한 방법이 있습니까? 나는 이런 식으로하고 싶다.

def make_file():
    yield "hello\n"
    yield "world\n"

output = tarfile.TarFile(…)
stream = iterable_to_stream(make_file())
output.addfile(…, stream)

해결법

  1. ==============================

    1.여기 내 스트리밍 반복기가 iterables를 통해 스트리밍 청크 요청을 지원하는 urllib3의 실험적 분기입니다.

    여기 내 스트리밍 반복기가 iterables를 통해 스트리밍 청크 요청을 지원하는 urllib3의 실험적 분기입니다.

    class IterStreamer(object):
        """
        File-like streaming iterator.
        """
        def __init__(self, generator):
            self.generator = generator
            self.iterator = iter(generator)
            self.leftover = ''
    
        def __len__(self):
            return self.generator.__len__()
    
        def __iter__(self):
            return self.iterator
    
        def next(self):
            return self.iterator.next()
    
        def read(self, size):
            data = self.leftover
            count = len(self.leftover)
    
            if count < size:
                try:
                    while count < size:
                        chunk = self.next()
                        data += chunk
                        count += len(chunk)
                except StopIteration:
                    pass
    
            self.leftover = data[size:]
    
            return data[:size]
    

    컨텍스트가있는 소스 : https://github.com/shazow/urllib3/blob/filepost-stream/urllib3/filepost.py#L23

    관련 단위 테스트 : https://github.com/shazow/urllib3/blob/filepost-stream/test/test_filepost.py#L9

    아아이 코드는 크기가 큰 청크 요청이 제대로 지원되지 않기 때문에 안정적인 지점으로 만들지는 못했지만 지금하려는 일에 대한 좋은 기반이되어야합니다. 어떻게 사용할 수 있는지 보여주는 예제는 소스 링크를 참조하십시오.

  2. ==============================

    2.Python 3에는 새로운 파일 형식의 객체 프로토콜을 대체하는 새로운 I / O 스트림 API (library docs)가 있습니다. (이 새로운 API는 Python 2의 io 모듈에서도 사용할 수 있으며 파일과 유사한 객체 프로토콜과 역 호환됩니다.)

    Python 3에는 새로운 파일 형식의 객체 프로토콜을 대체하는 새로운 I / O 스트림 API (library docs)가 있습니다. (이 새로운 API는 Python 2의 io 모듈에서도 사용할 수 있으며 파일과 유사한 객체 프로토콜과 역 호환됩니다.)

    다음은 Python 2 및 3의 새 API 구현입니다.

    import io
    
    def iterable_to_stream(iterable, buffer_size=io.DEFAULT_BUFFER_SIZE):
        """
        Lets you use an iterable (e.g. a generator) that yields bytestrings as a read-only
        input stream.
    
        The stream implements Python 3's newer I/O API (available in Python 2's io module).
        For efficiency, the stream is buffered.
        """
        class IterStream(io.RawIOBase):
            def __init__(self):
                self.leftover = None
            def readable(self):
                return True
            def readinto(self, b):
                try:
                    l = len(b)  # We're supposed to return at most this much
                    chunk = self.leftover or next(iterable)
                    output, self.leftover = chunk[:l], chunk[l:]
                    b[:len(output)] = output
                    return len(output)
                except StopIteration:
                    return 0    # indicate EOF
        return io.BufferedReader(IterStream(), buffer_size=buffer_size)
    

    사용 예 :

    with iterable_to_stream(str(x**2).encode('utf8') for x in range(11)) as s:
        print(s.read())
    
  3. ==============================

    3."표준"방식으로 보이지 않기 때문에 간단한 구현을 두드렸다.

    "표준"방식으로 보이지 않기 때문에 간단한 구현을 두드렸다.

    class iter_to_stream(object):
        def __init__(self, iterable):
            self.buffered = ""
            self.iter = iter(iterable)
    
        def read(self, size):
            result = ""
            while size > 0:
                data = self.buffered or next(self.iter, None)
                self.buffered = ""
                if data is None:
                    break
                size -= len(data)
                if size < 0:
                    data, self.buffered = data[:size], data[size:]
                result += data
            return result
    
  4. ==============================

    4.출발점 :

    출발점 :

    class iterable_to_stream:
        def __init__(self, iterable):
            self.iter = iter(iterable)
    
        def read(self):
            try:
                return self.iter.next()
            except StopIteration:
                return ""
    
  5. ==============================

    5.TarFile은 파일과 같은 인터페이스를 제공합니다. TarFile.addfile ()에 필요한 것을 얻기 위해 StringIO (파이썬 3.X를 사용하는 경우 io.StringIO)를 사용할 수도 있고, 파일과 같은 인터페이스를 제공하고 필요한 것을 산출합니다.

    TarFile은 파일과 같은 인터페이스를 제공합니다. TarFile.addfile ()에 필요한 것을 얻기 위해 StringIO (파이썬 3.X를 사용하는 경우 io.StringIO)를 사용할 수도 있고, 파일과 같은 인터페이스를 제공하고 필요한 것을 산출합니다.

  6. from https://stackoverflow.com/questions/6657820/how-to-convert-an-iterable-to-a-stream by cc-by-sa and MIT license