552b10a1795f921da7d1d032adb92fa6dbae42ff
[~helmut/crossqa.git] / common.py
1 def yield_lines(iterable):
2     """Converts an arbitrary bytes iterable into an iterable that yields whole
3     lines. The final byte of each returned value (except possibly the last one)
4     is a newline or carriage return character. The concatenation of the input
5     iterable equals the concatenation of the output iterable."""
6     buff = b""
7     for data in iterable:
8         buff += data
9         parts = buff.splitlines(True)
10         buff = parts.pop()
11         yield from parts
12     if buff:
13         yield buff
14
15 def decompress_stream(iterable, decompressor):
16     """Decompress an iterable of bytes using the given decompressor into
17     another (decompressed) iterable of bytes. The decompressor can be a
18     bz2.BZ2Decompressor or lzma.LZMADecompressor instance."""
19     for data in iterable:
20         data = decompressor.decompress(data)
21         yield data
22     if hasattr(decompressor, "flush"):
23         yield decompressor.flush()
24
25 def yield_chunks(filelike, chunksize=65536):
26     """Read the given file in chunks of the given size. Returns an itrable
27     of contents. If the file is binary, it yields bytes, otherwise str."""
28     while True:
29         data = filelike.read(chunksize)
30         if not data:
31             break
32         yield data