diff options
Diffstat (limited to 'Lib/io.py')
-rw-r--r-- | Lib/io.py | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -1182,6 +1182,7 @@ class TextIOWrapper(TextIOBase): self._readnl = newline self._writetranslate = newline != '' self._writenl = newline or os.linesep + self._encoder = None self._decoder = None self._pending = "" self._snapshot = None @@ -1240,8 +1241,9 @@ class TextIOWrapper(TextIOBase): haslf = (self._writetranslate or self._line_buffering) and "\n" in s if haslf and self._writetranslate and self._writenl != "\n": s = s.replace("\n", self._writenl) + encoder = self._encoder or self._get_encoder() # XXX What if we were just reading? - b = s.encode(self._encoding, self._errors) + b = encoder.encode(s) self.buffer.write(b) if self._line_buffering and (haslf or "\r" in s): self.flush() @@ -1250,11 +1252,13 @@ class TextIOWrapper(TextIOBase): self._decoder.reset() return length + def _get_encoder(self): + make_encoder = codecs.getincrementalencoder(self._encoding) + self._encoder = make_encoder(self._errors) + return self._encoder + def _get_decoder(self): make_decoder = codecs.getincrementaldecoder(self._encoding) - if make_decoder is None: - raise IOError("Can't find an incremental decoder for encoding %s" % - self._encoding) decoder = make_decoder(self._errors) if self._readuniversal: decoder = IncrementalNewlineDecoder(decoder, self._readtranslate) |