Adapt an iterator to behave like a file-like object in Python

前端 未结 8 1132
Happy的楠姐
Happy的楠姐 2020-12-13 07:00

I have a generator producing a list of strings. Is there a utility/adapter in Python that could make it look like a file?

For example,

>>> d         


        
8条回答
  •  無奈伤痛
    2020-12-13 07:41

    Here's a modified version of John and Matt's answer that can read a list/generator of strings and output bytearrays

    import itertools as it
    from io import TextIOBase
    
    class IterStringIO(TextIOBase):
        def __init__(self, iterable=None):
            iterable = iterable or []
            self.iter = it.chain.from_iterable(iterable)
    
        def not_newline(self, s):
            return s not in {'\n', '\r', '\r\n'}
    
        def write(self, iterable):
            to_chain = it.chain.from_iterable(iterable)
            self.iter = it.chain.from_iterable([self.iter, to_chain])
    
        def read(self, n=None):
            return bytearray(it.islice(self.iter, None, n))
    
        def readline(self, n=None):
            to_read = it.takewhile(self.not_newline, self.iter)
            return bytearray(it.islice(to_read, None, n))
    

    usage:

    ff = IterStringIO(c * 3 for c in ['a', 'b', 'c'])
    
    while True:
        data = ff.read(4)
    
        if not data:
            break
    
        print data
    
    aaab
    bbcc
    c
    

    alternate usage:

    ff = IterStringIO()
    ff.write('ffffd')
    ff.write(c * 3 for c in ['a', 'b', 'c'])
    
    while True:
        data = ff.read(4)
    
        if not data:
            break
    
        print data
    
    ffffda
    aabb
    bccc
    

提交回复
热议问题