summaryrefslogtreecommitdiff
path: root/common.py
blob: 552b10a1795f921da7d1d032adb92fa6dbae42ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def yield_lines(iterable):
    """Converts an arbitrary bytes iterable into an iterable that yields whole
    lines. The final byte of each returned value (except possibly the last one)
    is a newline or carriage return character. The concatenation of the input
    iterable equals the concatenation of the output iterable."""
    buff = b""
    for data in iterable:
        buff += data
        parts = buff.splitlines(True)
        buff = parts.pop()
        yield from parts
    if buff:
        yield buff

def decompress_stream(iterable, decompressor):
    """Decompress an iterable of bytes using the given decompressor into
    another (decompressed) iterable of bytes. The decompressor can be a
    bz2.BZ2Decompressor or lzma.LZMADecompressor instance."""
    for data in iterable:
        data = decompressor.decompress(data)
        yield data
    if hasattr(decompressor, "flush"):
        yield decompressor.flush()

def yield_chunks(filelike, chunksize=65536):
    """Read the given file in chunks of the given size. Returns an itrable
    of contents. If the file is binary, it yields bytes, otherwise str."""
    while True:
        data = filelike.read(chunksize)
        if not data:
            break
        yield data