io.StringIO. Параметр newline, по умолчанию '\n'. Можно выставить в \r\n, или во что нужно
Ожидание: питон сам догадается, что когда в буфер пишут \r\n это конец строки, и его надо оставить как есть
Реальность: на вход просто применяется replace('\n', self.newline), и в буфер пишется \r\r\n