blob: c2d803ccfedee3cfa897b22b027fb569b1e7e1c3 [file] [log] [blame]
Guido van Rossum53807da2007-04-10 19:01:47 +00001"""New I/O library conforming to PEP 3116.
Guido van Rossum28524c72007-02-27 05:47:44 +00002
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00003This is a prototype; hopefully eventually some of this will be
4reimplemented in C.
Guido van Rossum17e43e52007-02-27 15:45:13 +00005
Guido van Rossum53807da2007-04-10 19:01:47 +00006Conformance of alternative implementations: all arguments are intended
7to be positional-only except the arguments of the open() function.
8Argument names except those of the open() function are not part of the
9specification. Instance variables and methods whose name starts with
10a leading underscore are not part of the specification (except "magic"
11names like __iter__). Only the top-level names listed in the __all__
12variable are part of the specification.
Guido van Rossumc819dea2007-03-15 18:59:31 +000013
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +000014XXX edge cases when switching between reading/writing
Guido van Rossumc819dea2007-03-15 18:59:31 +000015XXX need to support 1 meaning line-buffered
Guido van Rossum9b76da62007-04-11 01:09:03 +000016XXX whenever an argument is None, use the default value
17XXX read/write ops should check readable/writable
Guido van Rossumd4103952007-04-12 05:44:49 +000018XXX buffered readinto should work with arbitrary buffer objects
Guido van Rossumd76e7792007-04-17 02:38:04 +000019XXX use incremental encoder for text output, at least for UTF-16 and UTF-8-SIG
Guido van Rossum5abbf752007-08-27 17:39:33 +000020XXX check writable, readable and seekable in appropriate places
Guido van Rossum28524c72007-02-27 05:47:44 +000021"""
22
Guido van Rossum68bbcd22007-02-27 17:19:33 +000023__author__ = ("Guido van Rossum <guido@python.org>, "
Guido van Rossum78892e42007-04-06 17:31:18 +000024 "Mike Verdone <mike.verdone@gmail.com>, "
25 "Mark Russell <mark.russell@zen.co.uk>")
Guido van Rossum28524c72007-02-27 05:47:44 +000026
Guido van Rossum141f7672007-04-10 00:22:16 +000027__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO",
Guido van Rossum5abbf752007-08-27 17:39:33 +000028 "BytesIO", "StringIO", "BufferedIOBase",
Guido van Rossum01a27522007-03-07 01:00:12 +000029 "BufferedReader", "BufferedWriter", "BufferedRWPair",
Guido van Rossum141f7672007-04-10 00:22:16 +000030 "BufferedRandom", "TextIOBase", "TextIOWrapper"]
Guido van Rossum28524c72007-02-27 05:47:44 +000031
32import os
Guido van Rossumb7f136e2007-08-22 18:14:10 +000033import abc
Guido van Rossum78892e42007-04-06 17:31:18 +000034import sys
35import codecs
Guido van Rossum141f7672007-04-10 00:22:16 +000036import _fileio
Guido van Rossum78892e42007-04-06 17:31:18 +000037import warnings
Guido van Rossum28524c72007-02-27 05:47:44 +000038
Guido van Rossum5abbf752007-08-27 17:39:33 +000039# open() uses st_blksize whenever we can
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000040DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
Guido van Rossum01a27522007-03-07 01:00:12 +000041
42
Guido van Rossum141f7672007-04-10 00:22:16 +000043class BlockingIOError(IOError):
Guido van Rossum78892e42007-04-06 17:31:18 +000044
Guido van Rossum141f7672007-04-10 00:22:16 +000045 """Exception raised when I/O would block on a non-blocking I/O stream."""
46
47 def __init__(self, errno, strerror, characters_written=0):
Guido van Rossum01a27522007-03-07 01:00:12 +000048 IOError.__init__(self, errno, strerror)
49 self.characters_written = characters_written
50
Guido van Rossum68bbcd22007-02-27 17:19:33 +000051
Guido van Rossum9cbfffd2007-06-07 00:54:15 +000052def open(file, mode="r", buffering=None, encoding=None, newline=None):
Brett Cannon7648ba82007-10-15 20:52:41 +000053 r"""Replacement for the built-in open function.
Guido van Rossum17e43e52007-02-27 15:45:13 +000054
55 Args:
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000056 file: string giving the name of the file to be opened;
Guido van Rossum9b76da62007-04-11 01:09:03 +000057 or integer file descriptor of the file to be wrapped (*).
58 mode: optional mode string; see below.
Guido van Rossum17e43e52007-02-27 15:45:13 +000059 buffering: optional int >= 0 giving the buffer size; values
60 can be: 0 = unbuffered, 1 = line buffered,
Guido van Rossum9b76da62007-04-11 01:09:03 +000061 larger = fully buffered.
Guido van Rossum9b76da62007-04-11 01:09:03 +000062 encoding: optional string giving the text encoding.
Guido van Rossum8358db22007-08-18 21:39:55 +000063 newline: optional newlines specifier; must be None, '', '\n', '\r'
64 or '\r\n'; all other values are illegal. It controls the
65 handling of line endings. It works as follows:
66
67 * On input, if `newline` is `None`, universal newlines
68 mode is enabled. Lines in the input can end in `'\n'`,
69 `'\r'`, or `'\r\n'`, and these are translated into
70 `'\n'` before being returned to the caller. If it is
71 `''`, universal newline mode is enabled, but line endings
72 are returned to the caller untranslated. If it has any of
73 the other legal values, input lines are only terminated by
74 the given string, and the line ending is returned to the
75 caller untranslated.
76
77 * On output, if `newline` is `None`, any `'\n'`
78 characters written are translated to the system default
79 line separator, `os.linesep`. If `newline` is `''`,
80 no translation takes place. If `newline` is any of the
81 other legal values, any `'\n'` characters written are
82 translated to the given string.
Guido van Rossum17e43e52007-02-27 15:45:13 +000083
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000084 (*) If a file descriptor is given, it is closed when the returned
85 I/O object is closed. If you don't want this to happen, use
86 os.dup() to create a duplicate file descriptor.
87
Guido van Rossum17e43e52007-02-27 15:45:13 +000088 Mode strings characters:
89 'r': open for reading (default)
90 'w': open for writing, truncating the file first
91 'a': open for writing, appending to the end if the file exists
92 'b': binary mode
93 't': text mode (default)
94 '+': open a disk file for updating (implies reading and writing)
Guido van Rossum9be55972007-04-07 02:59:27 +000095 'U': universal newline mode (for backwards compatibility)
Guido van Rossum17e43e52007-02-27 15:45:13 +000096
97 Constraints:
98 - encoding must not be given when a binary mode is given
99 - buffering must not be zero when a text mode is given
100
101 Returns:
102 Depending on the mode and buffering arguments, either a raw
103 binary stream, a buffered binary stream, or a buffered text
104 stream, open for reading and/or writing.
105 """
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000106 if not isinstance(file, (str, int)):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000107 raise TypeError("invalid file: %r" % file)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000108 if not isinstance(mode, str):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000109 raise TypeError("invalid mode: %r" % mode)
110 if buffering is not None and not isinstance(buffering, int):
111 raise TypeError("invalid buffering: %r" % buffering)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000112 if encoding is not None and not isinstance(encoding, str):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000113 raise TypeError("invalid encoding: %r" % encoding)
Guido van Rossum28524c72007-02-27 05:47:44 +0000114 modes = set(mode)
Guido van Rossum9be55972007-04-07 02:59:27 +0000115 if modes - set("arwb+tU") or len(mode) > len(modes):
Guido van Rossum28524c72007-02-27 05:47:44 +0000116 raise ValueError("invalid mode: %r" % mode)
117 reading = "r" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000118 writing = "w" in modes
Guido van Rossum28524c72007-02-27 05:47:44 +0000119 appending = "a" in modes
120 updating = "+" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000121 text = "t" in modes
122 binary = "b" in modes
Guido van Rossum7165cb12007-07-10 06:54:34 +0000123 if "U" in modes:
124 if writing or appending:
125 raise ValueError("can't use U and writing mode at once")
Guido van Rossum9be55972007-04-07 02:59:27 +0000126 reading = True
Guido van Rossum28524c72007-02-27 05:47:44 +0000127 if text and binary:
128 raise ValueError("can't have text and binary mode at once")
129 if reading + writing + appending > 1:
130 raise ValueError("can't have read/write/append mode at once")
131 if not (reading or writing or appending):
132 raise ValueError("must have exactly one of read/write/append mode")
133 if binary and encoding is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +0000134 raise ValueError("binary mode doesn't take an encoding argument")
135 if binary and newline is not None:
136 raise ValueError("binary mode doesn't take a newline argument")
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000137 raw = FileIO(file,
Guido van Rossum28524c72007-02-27 05:47:44 +0000138 (reading and "r" or "") +
139 (writing and "w" or "") +
140 (appending and "a" or "") +
141 (updating and "+" or ""))
142 if buffering is None:
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000143 buffering = -1
Guido van Rossum5abbf752007-08-27 17:39:33 +0000144 if buffering < 0 and raw.isatty():
145 buffering = 1
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000146 if buffering < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000147 buffering = DEFAULT_BUFFER_SIZE
Guido van Rossum17e43e52007-02-27 15:45:13 +0000148 try:
149 bs = os.fstat(raw.fileno()).st_blksize
150 except (os.error, AttributeError):
Guido van Rossumbb09b212007-03-18 03:36:28 +0000151 pass
152 else:
Guido van Rossum17e43e52007-02-27 15:45:13 +0000153 if bs > 1:
154 buffering = bs
Guido van Rossum28524c72007-02-27 05:47:44 +0000155 if buffering < 0:
156 raise ValueError("invalid buffering size")
157 if buffering == 0:
158 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000159 raw._name = file
160 raw._mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000161 return raw
162 raise ValueError("can't have unbuffered text I/O")
163 if updating:
164 buffer = BufferedRandom(raw, buffering)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000165 elif writing or appending:
Guido van Rossum28524c72007-02-27 05:47:44 +0000166 buffer = BufferedWriter(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000167 elif reading:
Guido van Rossum28524c72007-02-27 05:47:44 +0000168 buffer = BufferedReader(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000169 else:
170 raise ValueError("unknown mode: %r" % mode)
Guido van Rossum28524c72007-02-27 05:47:44 +0000171 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000172 buffer.name = file
173 buffer.mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000174 return buffer
Guido van Rossum13633bb2007-04-13 18:42:35 +0000175 text = TextIOWrapper(buffer, encoding, newline)
176 text.name = file
177 text.mode = mode
178 return text
Guido van Rossum28524c72007-02-27 05:47:44 +0000179
180
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000181class OpenWrapper:
182 """Wrapper for __builtin__.open
183
184 Trick so that open won't become a bound method when stored
185 as a class variable (as dumbdbm does).
186
187 See initstdio() in Python/pythonrun.c.
188 """
189 def __new__(cls, *args, **kwargs):
190 return open(*args, **kwargs)
191
192
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000193class UnsupportedOperation(ValueError, IOError):
194 pass
195
196
Guido van Rossumb7f136e2007-08-22 18:14:10 +0000197class IOBase(metaclass=abc.ABCMeta):
Guido van Rossum28524c72007-02-27 05:47:44 +0000198
Guido van Rossum141f7672007-04-10 00:22:16 +0000199 """Base class for all I/O classes.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000200
Guido van Rossum141f7672007-04-10 00:22:16 +0000201 This class provides dummy implementations for many methods that
Guido van Rossum17e43e52007-02-27 15:45:13 +0000202 derived classes can override selectively; the default
203 implementations represent a file that cannot be read, written or
204 seeked.
205
Guido van Rossum141f7672007-04-10 00:22:16 +0000206 This does not define read(), readinto() and write(), nor
207 readline() and friends, since their signatures vary per layer.
Guido van Rossum53807da2007-04-10 19:01:47 +0000208
209 Not that calling any method (even inquiries) on a closed file is
210 undefined. Implementations may raise IOError in this case.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000211 """
212
Guido van Rossum141f7672007-04-10 00:22:16 +0000213 ### Internal ###
214
215 def _unsupported(self, name: str) -> IOError:
216 """Internal: raise an exception for unsupported operations."""
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000217 raise UnsupportedOperation("%s.%s() not supported" %
218 (self.__class__.__name__, name))
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000219
Guido van Rossum141f7672007-04-10 00:22:16 +0000220 ### Positioning ###
221
Guido van Rossum53807da2007-04-10 19:01:47 +0000222 def seek(self, pos: int, whence: int = 0) -> int:
223 """seek(pos: int, whence: int = 0) -> int. Change stream position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000224
225 Seek to byte offset pos relative to position indicated by whence:
226 0 Start of stream (the default). pos should be >= 0;
227 1 Current position - whence may be negative;
228 2 End of stream - whence usually negative.
Guido van Rossum53807da2007-04-10 19:01:47 +0000229 Returns the new absolute position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000230 """
231 self._unsupported("seek")
232
233 def tell(self) -> int:
234 """tell() -> int. Return current stream position."""
Guido van Rossum53807da2007-04-10 19:01:47 +0000235 return self.seek(0, 1)
Guido van Rossum141f7672007-04-10 00:22:16 +0000236
Guido van Rossum87429772007-04-10 21:06:59 +0000237 def truncate(self, pos: int = None) -> int:
238 """truncate(size: int = None) -> int. Truncate file to size bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000239
240 Size defaults to the current IO position as reported by tell().
Guido van Rossum87429772007-04-10 21:06:59 +0000241 Returns the new size.
Guido van Rossum141f7672007-04-10 00:22:16 +0000242 """
243 self._unsupported("truncate")
244
245 ### Flush and close ###
246
247 def flush(self) -> None:
248 """flush() -> None. Flushes write buffers, if applicable.
249
250 This is a no-op for read-only and non-blocking streams.
251 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000252 # XXX Should this return the number of bytes written???
Guido van Rossum141f7672007-04-10 00:22:16 +0000253
254 __closed = False
255
256 def close(self) -> None:
257 """close() -> None. Flushes and closes the IO object.
258
259 This must be idempotent. It should also set a flag for the
260 'closed' property (see below) to test.
261 """
262 if not self.__closed:
Guido van Rossum469734b2007-07-10 12:00:45 +0000263 try:
264 self.flush()
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000265 except IOError:
266 pass # If flush() fails, just give up
267 self.__closed = True
Guido van Rossum141f7672007-04-10 00:22:16 +0000268
269 def __del__(self) -> None:
270 """Destructor. Calls close()."""
271 # The try/except block is in case this is called at program
272 # exit time, when it's possible that globals have already been
273 # deleted, and then the close() call might fail. Since
274 # there's nothing we can do about such failures and they annoy
275 # the end users, we suppress the traceback.
276 try:
277 self.close()
278 except:
279 pass
280
281 ### Inquiries ###
282
283 def seekable(self) -> bool:
284 """seekable() -> bool. Return whether object supports random access.
285
286 If False, seek(), tell() and truncate() will raise IOError.
287 This method may need to do a test seek().
288 """
289 return False
290
Guido van Rossum5abbf752007-08-27 17:39:33 +0000291 def _checkSeekable(self, msg=None):
292 """Internal: raise an IOError if file is not seekable
293 """
294 if not self.seekable():
295 raise IOError("File or stream is not seekable."
296 if msg is None else msg)
297
298
Guido van Rossum141f7672007-04-10 00:22:16 +0000299 def readable(self) -> bool:
300 """readable() -> bool. Return whether object was opened for reading.
301
302 If False, read() will raise IOError.
303 """
304 return False
305
Guido van Rossum5abbf752007-08-27 17:39:33 +0000306 def _checkReadable(self, msg=None):
307 """Internal: raise an IOError if file is not readable
308 """
309 if not self.readable():
310 raise IOError("File or stream is not readable."
311 if msg is None else msg)
312
Guido van Rossum141f7672007-04-10 00:22:16 +0000313 def writable(self) -> bool:
314 """writable() -> bool. Return whether object was opened for writing.
315
316 If False, write() and truncate() will raise IOError.
317 """
318 return False
319
Guido van Rossum5abbf752007-08-27 17:39:33 +0000320 def _checkWritable(self, msg=None):
321 """Internal: raise an IOError if file is not writable
322 """
323 if not self.writable():
324 raise IOError("File or stream is not writable."
325 if msg is None else msg)
326
Guido van Rossum141f7672007-04-10 00:22:16 +0000327 @property
328 def closed(self):
329 """closed: bool. True iff the file has been closed.
330
331 For backwards compatibility, this is a property, not a predicate.
332 """
333 return self.__closed
334
Guido van Rossum5abbf752007-08-27 17:39:33 +0000335 def _checkClosed(self, msg=None):
336 """Internal: raise an ValueError if file is closed
337 """
338 if self.closed:
339 raise ValueError("I/O operation on closed file."
340 if msg is None else msg)
341
Guido van Rossum141f7672007-04-10 00:22:16 +0000342 ### Context manager ###
343
344 def __enter__(self) -> "IOBase": # That's a forward reference
345 """Context management protocol. Returns self."""
346 return self
347
348 def __exit__(self, *args) -> None:
349 """Context management protocol. Calls close()"""
350 self.close()
351
352 ### Lower-level APIs ###
353
354 # XXX Should these be present even if unimplemented?
355
356 def fileno(self) -> int:
357 """fileno() -> int. Returns underlying file descriptor if one exists.
358
359 Raises IOError if the IO object does not use a file descriptor.
360 """
361 self._unsupported("fileno")
362
363 def isatty(self) -> bool:
364 """isatty() -> int. Returns whether this is an 'interactive' stream.
365
366 Returns False if we don't know.
367 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000368 self._checkClosed()
Guido van Rossum141f7672007-04-10 00:22:16 +0000369 return False
370
Guido van Rossum7165cb12007-07-10 06:54:34 +0000371 ### Readline[s] and writelines ###
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000372
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000373 def readline(self, limit: int = -1) -> bytes:
374 """For backwards compatibility, a (slowish) readline()."""
Guido van Rossum2bf71382007-06-08 00:07:57 +0000375 if hasattr(self, "peek"):
376 def nreadahead():
377 readahead = self.peek(1, unsafe=True)
378 if not readahead:
379 return 1
380 n = (readahead.find(b"\n") + 1) or len(readahead)
381 if limit >= 0:
382 n = min(n, limit)
383 return n
384 else:
385 def nreadahead():
386 return 1
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000387 if limit is None:
388 limit = -1
389 res = bytes()
390 while limit < 0 or len(res) < limit:
Guido van Rossum2bf71382007-06-08 00:07:57 +0000391 b = self.read(nreadahead())
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000392 if not b:
393 break
394 res += b
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000395 if res.endswith(b"\n"):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000396 break
397 return res
398
Guido van Rossum7165cb12007-07-10 06:54:34 +0000399 def __iter__(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000400 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000401 return self
402
403 def __next__(self):
404 line = self.readline()
405 if not line:
406 raise StopIteration
407 return line
408
409 def readlines(self, hint=None):
410 if hint is None:
411 return list(self)
412 n = 0
413 lines = []
414 for line in self:
415 lines.append(line)
416 n += len(line)
417 if n >= hint:
418 break
419 return lines
420
421 def writelines(self, lines):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000422 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000423 for line in lines:
424 self.write(line)
425
Guido van Rossum141f7672007-04-10 00:22:16 +0000426
427class RawIOBase(IOBase):
428
429 """Base class for raw binary I/O.
430
431 The read() method is implemented by calling readinto(); derived
432 classes that want to support read() only need to implement
433 readinto() as a primitive operation. In general, readinto()
434 can be more efficient than read().
435
436 (It would be tempting to also provide an implementation of
437 readinto() in terms of read(), in case the latter is a more
438 suitable primitive operation, but that would lead to nasty
439 recursion in case a subclass doesn't implement either.)
440 """
441
Guido van Rossum7165cb12007-07-10 06:54:34 +0000442 def read(self, n: int = -1) -> bytes:
Guido van Rossum78892e42007-04-06 17:31:18 +0000443 """read(n: int) -> bytes. Read and return up to n bytes.
Guido van Rossum01a27522007-03-07 01:00:12 +0000444
445 Returns an empty bytes array on EOF, or None if the object is
446 set not to block and has no data to read.
447 """
Guido van Rossum7165cb12007-07-10 06:54:34 +0000448 if n is None:
449 n = -1
450 if n < 0:
451 return self.readall()
Guido van Rossum28524c72007-02-27 05:47:44 +0000452 b = bytes(n.__index__())
Guido van Rossum00efead2007-03-07 05:23:25 +0000453 n = self.readinto(b)
454 del b[n:]
Guido van Rossum28524c72007-02-27 05:47:44 +0000455 return b
456
Guido van Rossum7165cb12007-07-10 06:54:34 +0000457 def readall(self):
458 """readall() -> bytes. Read until EOF, using multiple read() call."""
459 res = bytes()
460 while True:
461 data = self.read(DEFAULT_BUFFER_SIZE)
462 if not data:
463 break
464 res += data
465 return res
466
Guido van Rossum141f7672007-04-10 00:22:16 +0000467 def readinto(self, b: bytes) -> int:
468 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
Guido van Rossum78892e42007-04-06 17:31:18 +0000469
470 Returns number of bytes read (0 for EOF), or None if the object
471 is set not to block as has no data to read.
472 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000473 self._unsupported("readinto")
Guido van Rossum28524c72007-02-27 05:47:44 +0000474
Guido van Rossum141f7672007-04-10 00:22:16 +0000475 def write(self, b: bytes) -> int:
Guido van Rossum78892e42007-04-06 17:31:18 +0000476 """write(b: bytes) -> int. Write the given buffer to the IO stream.
Guido van Rossum01a27522007-03-07 01:00:12 +0000477
Guido van Rossum78892e42007-04-06 17:31:18 +0000478 Returns the number of bytes written, which may be less than len(b).
Guido van Rossum01a27522007-03-07 01:00:12 +0000479 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000480 self._unsupported("write")
Guido van Rossum28524c72007-02-27 05:47:44 +0000481
Guido van Rossum78892e42007-04-06 17:31:18 +0000482
Guido van Rossum141f7672007-04-10 00:22:16 +0000483class FileIO(_fileio._FileIO, RawIOBase):
Guido van Rossum28524c72007-02-27 05:47:44 +0000484
Guido van Rossum141f7672007-04-10 00:22:16 +0000485 """Raw I/O implementation for OS files.
Guido van Rossum28524c72007-02-27 05:47:44 +0000486
Guido van Rossum141f7672007-04-10 00:22:16 +0000487 This multiply inherits from _FileIO and RawIOBase to make
488 isinstance(io.FileIO(), io.RawIOBase) return True without
489 requiring that _fileio._FileIO inherits from io.RawIOBase (which
490 would be hard to do since _fileio.c is written in C).
491 """
Guido van Rossuma9e20242007-03-08 00:43:48 +0000492
Guido van Rossum87429772007-04-10 21:06:59 +0000493 def close(self):
494 _fileio._FileIO.close(self)
495 RawIOBase.close(self)
496
Guido van Rossum13633bb2007-04-13 18:42:35 +0000497 @property
498 def name(self):
499 return self._name
500
501 @property
502 def mode(self):
503 return self._mode
504
Guido van Rossuma9e20242007-03-08 00:43:48 +0000505
Guido van Rossumcce92b22007-04-10 14:41:39 +0000506class BufferedIOBase(IOBase):
Guido van Rossum141f7672007-04-10 00:22:16 +0000507
508 """Base class for buffered IO objects.
509
510 The main difference with RawIOBase is that the read() method
511 supports omitting the size argument, and does not have a default
512 implementation that defers to readinto().
513
514 In addition, read(), readinto() and write() may raise
515 BlockingIOError if the underlying raw stream is in non-blocking
516 mode and not ready; unlike their raw counterparts, they will never
517 return None.
518
519 A typical implementation should not inherit from a RawIOBase
520 implementation, but wrap one.
521 """
522
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000523 def read(self, n: int = None) -> bytes:
524 """read(n: int = None) -> bytes. Read and return up to n bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000525
Guido van Rossum024da5c2007-05-17 23:59:11 +0000526 If the argument is omitted, None, or negative, reads and
527 returns all data until EOF.
Guido van Rossum141f7672007-04-10 00:22:16 +0000528
529 If the argument is positive, and the underlying raw stream is
530 not 'interactive', multiple raw reads may be issued to satisfy
531 the byte count (unless EOF is reached first). But for
532 interactive raw streams (XXX and for pipes?), at most one raw
533 read will be issued, and a short result does not imply that
534 EOF is imminent.
535
536 Returns an empty bytes array on EOF.
537
538 Raises BlockingIOError if the underlying raw stream has no
539 data at the moment.
540 """
541 self._unsupported("read")
542
543 def readinto(self, b: bytes) -> int:
544 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
545
546 Like read(), this may issue multiple reads to the underlying
547 raw stream, unless the latter is 'interactive' (XXX or a
548 pipe?).
549
550 Returns the number of bytes read (0 for EOF).
551
552 Raises BlockingIOError if the underlying raw stream has no
553 data at the moment.
554 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000555 # XXX This ought to work with anything that supports the buffer API
Guido van Rossum87429772007-04-10 21:06:59 +0000556 data = self.read(len(b))
557 n = len(data)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000558 try:
559 b[:n] = data
560 except TypeError as err:
561 import array
562 if not isinstance(b, array.array):
563 raise err
564 b[:n] = array.array('b', data)
Guido van Rossum87429772007-04-10 21:06:59 +0000565 return n
Guido van Rossum141f7672007-04-10 00:22:16 +0000566
567 def write(self, b: bytes) -> int:
568 """write(b: bytes) -> int. Write the given buffer to the IO stream.
569
570 Returns the number of bytes written, which is never less than
571 len(b).
572
573 Raises BlockingIOError if the buffer is full and the
574 underlying raw stream cannot accept more data at the moment.
575 """
576 self._unsupported("write")
577
578
579class _BufferedIOMixin(BufferedIOBase):
580
581 """A mixin implementation of BufferedIOBase with an underlying raw stream.
582
583 This passes most requests on to the underlying raw stream. It
584 does *not* provide implementations of read(), readinto() or
585 write().
586 """
587
588 def __init__(self, raw):
589 self.raw = raw
590
591 ### Positioning ###
592
593 def seek(self, pos, whence=0):
Guido van Rossum53807da2007-04-10 19:01:47 +0000594 return self.raw.seek(pos, whence)
Guido van Rossum141f7672007-04-10 00:22:16 +0000595
596 def tell(self):
597 return self.raw.tell()
598
599 def truncate(self, pos=None):
Guido van Rossum79b79ee2007-10-25 23:21:03 +0000600 # Flush the stream. We're mixing buffered I/O with lower-level I/O,
601 # and a flush may be necessary to synch both views of the current
602 # file state.
603 self.flush()
Guido van Rossum57233cb2007-10-26 17:19:33 +0000604
605 if pos is None:
606 pos = self.tell()
607 return self.raw.truncate(pos)
Guido van Rossum141f7672007-04-10 00:22:16 +0000608
609 ### Flush and close ###
610
611 def flush(self):
612 self.raw.flush()
613
614 def close(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000615 if not self.closed:
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000616 try:
617 self.flush()
618 except IOError:
619 pass # If flush() fails, just give up
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000620 self.raw.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000621
622 ### Inquiries ###
623
624 def seekable(self):
625 return self.raw.seekable()
626
627 def readable(self):
628 return self.raw.readable()
629
630 def writable(self):
631 return self.raw.writable()
632
633 @property
634 def closed(self):
635 return self.raw.closed
636
637 ### Lower-level APIs ###
638
639 def fileno(self):
640 return self.raw.fileno()
641
642 def isatty(self):
643 return self.raw.isatty()
644
645
Guido van Rossum024da5c2007-05-17 23:59:11 +0000646class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000647
Guido van Rossum024da5c2007-05-17 23:59:11 +0000648 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000649
Guido van Rossum024da5c2007-05-17 23:59:11 +0000650 # XXX More docs
651
652 def __init__(self, initial_bytes=None):
653 buffer = b""
654 if initial_bytes is not None:
655 buffer += initial_bytes
Guido van Rossum78892e42007-04-06 17:31:18 +0000656 self._buffer = buffer
Guido van Rossum28524c72007-02-27 05:47:44 +0000657 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000658
659 def getvalue(self):
660 return self._buffer
661
Guido van Rossum024da5c2007-05-17 23:59:11 +0000662 def read(self, n=None):
663 if n is None:
664 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000665 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000666 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000667 newpos = min(len(self._buffer), self._pos + n)
668 b = self._buffer[self._pos : newpos]
669 self._pos = newpos
670 return b
671
Guido van Rossum024da5c2007-05-17 23:59:11 +0000672 def read1(self, n):
673 return self.read(n)
674
Guido van Rossum28524c72007-02-27 05:47:44 +0000675 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000676 if self.closed:
677 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000678 if isinstance(b, str):
679 raise TypeError("can't write str to binary stream")
Guido van Rossum28524c72007-02-27 05:47:44 +0000680 n = len(b)
681 newpos = self._pos + n
Guido van Rossumb972a782007-07-21 00:25:15 +0000682 if newpos > len(self._buffer):
683 # Inserts null bytes between the current end of the file
684 # and the new write position.
Guido van Rossuma74184e2007-08-29 04:05:57 +0000685 padding = b'\x00' * (newpos - len(self._buffer) - n)
Guido van Rossumb972a782007-07-21 00:25:15 +0000686 self._buffer[self._pos:newpos - n] = padding
Guido van Rossum28524c72007-02-27 05:47:44 +0000687 self._buffer[self._pos:newpos] = b
688 self._pos = newpos
689 return n
690
691 def seek(self, pos, whence=0):
692 if whence == 0:
693 self._pos = max(0, pos)
694 elif whence == 1:
695 self._pos = max(0, self._pos + pos)
696 elif whence == 2:
697 self._pos = max(0, len(self._buffer) + pos)
698 else:
699 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000700 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000701
702 def tell(self):
703 return self._pos
704
705 def truncate(self, pos=None):
706 if pos is None:
707 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000708 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000709 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000710
711 def readable(self):
712 return True
713
714 def writable(self):
715 return True
716
717 def seekable(self):
718 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000719
720
Guido van Rossum141f7672007-04-10 00:22:16 +0000721class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000722
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000723 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000724
Guido van Rossum78892e42007-04-06 17:31:18 +0000725 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000726 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000727 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000728 raw._checkReadable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000729 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000730 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000731 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000732
Guido van Rossum024da5c2007-05-17 23:59:11 +0000733 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000734 """Read n bytes.
735
736 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000737 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000738 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000739 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000740 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000741 if n is None:
742 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000743 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000744 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000745 to_read = max(self.buffer_size,
746 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000747 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000748 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000749 nodata_val = current
750 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000751 self._read_buf += current
752 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000753 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000754 n = len(self._read_buf)
755 out = self._read_buf[:n]
756 self._read_buf = self._read_buf[n:]
757 else:
758 out = nodata_val
759 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000760
Guido van Rossum13633bb2007-04-13 18:42:35 +0000761 def peek(self, n=0, *, unsafe=False):
762 """Returns buffered bytes without advancing the position.
763
764 The argument indicates a desired minimal number of bytes; we
765 do at most one raw read to satisfy it. We never return more
766 than self.buffer_size.
767
768 Unless unsafe=True is passed, we return a copy.
769 """
770 want = min(n, self.buffer_size)
771 have = len(self._read_buf)
772 if have < want:
773 to_read = self.buffer_size - have
774 current = self.raw.read(to_read)
775 if current:
776 self._read_buf += current
777 result = self._read_buf
778 if unsafe:
779 result = result[:]
780 return result
781
782 def read1(self, n):
783 """Reads up to n bytes.
784
785 Returns up to n bytes. If at least one byte is buffered,
786 we only return buffered bytes. Otherwise, we do one
787 raw read.
788 """
789 if n <= 0:
790 return b""
791 self.peek(1, unsafe=True)
792 return self.read(min(n, len(self._read_buf)))
793
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000794 def tell(self):
795 return self.raw.tell() - len(self._read_buf)
796
797 def seek(self, pos, whence=0):
798 if whence == 1:
799 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000800 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000801 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000802 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000803
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000804
Guido van Rossum141f7672007-04-10 00:22:16 +0000805class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000806
Guido van Rossum78892e42007-04-06 17:31:18 +0000807 # XXX docstring
808
Guido van Rossum141f7672007-04-10 00:22:16 +0000809 def __init__(self, raw,
810 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000811 raw._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000812 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000813 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000814 self.max_buffer_size = (2*buffer_size
815 if max_buffer_size is None
816 else max_buffer_size)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000817 self._write_buf = b""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000818
819 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000820 if self.closed:
821 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000822 if isinstance(b, str):
823 raise TypeError("can't write str to binary stream")
Guido van Rossum01a27522007-03-07 01:00:12 +0000824 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000825 if len(self._write_buf) > self.buffer_size:
826 # We're full, so let's pre-flush the buffer
827 try:
828 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000829 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000830 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000831 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000832 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000833 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000834 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000835 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000836 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000837 try:
838 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000839 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000840 if (len(self._write_buf) > self.max_buffer_size):
841 # We've hit max_buffer_size. We have to accept a partial
842 # write and cut back our buffer.
843 overage = len(self._write_buf) - self.max_buffer_size
844 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000845 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000846 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000847
848 def flush(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000849 if self.closed:
850 raise ValueError("flush of closed file")
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000851 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000852 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000853 while self._write_buf:
854 n = self.raw.write(self._write_buf)
855 del self._write_buf[:n]
856 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000857 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000858 n = e.characters_written
859 del self._write_buf[:n]
860 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000861 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000862
863 def tell(self):
864 return self.raw.tell() + len(self._write_buf)
865
866 def seek(self, pos, whence=0):
867 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000868 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000869
Guido van Rossum01a27522007-03-07 01:00:12 +0000870
Guido van Rossum141f7672007-04-10 00:22:16 +0000871class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000872
Guido van Rossum01a27522007-03-07 01:00:12 +0000873 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000874
Guido van Rossum141f7672007-04-10 00:22:16 +0000875 A buffered reader object and buffered writer object put together
876 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000877
878 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000879
880 XXX The usefulness of this (compared to having two separate IO
881 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000882 """
883
Guido van Rossum141f7672007-04-10 00:22:16 +0000884 def __init__(self, reader, writer,
885 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
886 """Constructor.
887
888 The arguments are two RawIO instances.
889 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000890 reader._checkReadable()
891 writer._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000892 self.reader = BufferedReader(reader, buffer_size)
893 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000894
Guido van Rossum024da5c2007-05-17 23:59:11 +0000895 def read(self, n=None):
896 if n is None:
897 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000898 return self.reader.read(n)
899
Guido van Rossum141f7672007-04-10 00:22:16 +0000900 def readinto(self, b):
901 return self.reader.readinto(b)
902
Guido van Rossum01a27522007-03-07 01:00:12 +0000903 def write(self, b):
904 return self.writer.write(b)
905
Guido van Rossum13633bb2007-04-13 18:42:35 +0000906 def peek(self, n=0, *, unsafe=False):
907 return self.reader.peek(n, unsafe=unsafe)
908
909 def read1(self, n):
910 return self.reader.read1(n)
911
Guido van Rossum01a27522007-03-07 01:00:12 +0000912 def readable(self):
913 return self.reader.readable()
914
915 def writable(self):
916 return self.writer.writable()
917
918 def flush(self):
919 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000920
Guido van Rossum01a27522007-03-07 01:00:12 +0000921 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000922 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000923 self.reader.close()
924
925 def isatty(self):
926 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000927
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000928 @property
929 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000930 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000931
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000932
Guido van Rossum141f7672007-04-10 00:22:16 +0000933class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000934
Guido van Rossum78892e42007-04-06 17:31:18 +0000935 # XXX docstring
936
Guido van Rossum141f7672007-04-10 00:22:16 +0000937 def __init__(self, raw,
938 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000939 raw._checkSeekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000940 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000941 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
942
Guido van Rossum01a27522007-03-07 01:00:12 +0000943 def seek(self, pos, whence=0):
944 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000945 # First do the raw seek, then empty the read buffer, so that
946 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000947 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000948 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000949 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000950
951 def tell(self):
952 if (self._write_buf):
953 return self.raw.tell() + len(self._write_buf)
954 else:
955 return self.raw.tell() - len(self._read_buf)
956
Guido van Rossum024da5c2007-05-17 23:59:11 +0000957 def read(self, n=None):
958 if n is None:
959 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000960 self.flush()
961 return BufferedReader.read(self, n)
962
Guido van Rossum141f7672007-04-10 00:22:16 +0000963 def readinto(self, b):
964 self.flush()
965 return BufferedReader.readinto(self, b)
966
Guido van Rossum13633bb2007-04-13 18:42:35 +0000967 def peek(self, n=0, *, unsafe=False):
968 self.flush()
969 return BufferedReader.peek(self, n, unsafe=unsafe)
970
971 def read1(self, n):
972 self.flush()
973 return BufferedReader.read1(self, n)
974
Guido van Rossum01a27522007-03-07 01:00:12 +0000975 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +0000976 if self._read_buf:
977 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
978 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +0000979 return BufferedWriter.write(self, b)
980
Guido van Rossum78892e42007-04-06 17:31:18 +0000981
Guido van Rossumcce92b22007-04-10 14:41:39 +0000982class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +0000983
984 """Base class for text I/O.
985
986 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +0000987
988 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +0000989 """
990
991 def read(self, n: int = -1) -> str:
992 """read(n: int = -1) -> str. Read at most n characters from stream.
993
994 Read from underlying buffer until we have n characters or we hit EOF.
995 If n is negative or omitted, read until EOF.
996 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000997 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +0000998
Guido van Rossum9b76da62007-04-11 01:09:03 +0000999 def write(self, s: str) -> int:
1000 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001001 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +00001002
Guido van Rossum9b76da62007-04-11 01:09:03 +00001003 def truncate(self, pos: int = None) -> int:
1004 """truncate(pos: int = None) -> int. Truncate size to pos."""
1005 self.flush()
1006 if pos is None:
1007 pos = self.tell()
1008 self.seek(pos)
1009 return self.buffer.truncate()
1010
Guido van Rossum78892e42007-04-06 17:31:18 +00001011 def readline(self) -> str:
1012 """readline() -> str. Read until newline or EOF.
1013
1014 Returns an empty string if EOF is hit immediately.
1015 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001016 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +00001017
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001018 @property
1019 def encoding(self):
1020 """Subclasses should override."""
1021 return None
1022
Guido van Rossum8358db22007-08-18 21:39:55 +00001023 @property
1024 def newlines(self):
1025 """newlines -> None | str | tuple of str. Line endings translated
1026 so far.
1027
1028 Only line endings translated during reading are considered.
1029
1030 Subclasses should override.
1031 """
1032 return None
1033
Guido van Rossum78892e42007-04-06 17:31:18 +00001034
1035class TextIOWrapper(TextIOBase):
1036
1037 """Buffered text stream.
1038
1039 Character and line based layer over a BufferedIOBase object.
1040 """
1041
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001042 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +00001043
1044 def __init__(self, buffer, encoding=None, newline=None):
Guido van Rossum8358db22007-08-18 21:39:55 +00001045 if newline not in (None, "", "\n", "\r", "\r\n"):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001046 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +00001047 if encoding is None:
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001048 try:
1049 encoding = os.device_encoding(buffer.fileno())
Brett Cannon041683d2007-10-11 23:08:53 +00001050 except (AttributeError, UnsupportedOperation):
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001051 pass
1052 if encoding is None:
Martin v. Löwisd78d3b42007-08-11 15:36:45 +00001053 try:
1054 import locale
1055 except ImportError:
1056 # Importing locale may fail if Python is being built
1057 encoding = "ascii"
1058 else:
1059 encoding = locale.getpreferredencoding()
Guido van Rossum78892e42007-04-06 17:31:18 +00001060
1061 self.buffer = buffer
1062 self._encoding = encoding
Guido van Rossum8358db22007-08-18 21:39:55 +00001063 self._readuniversal = not newline
1064 self._readtranslate = newline is None
1065 self._readnl = newline
1066 self._writetranslate = newline != ''
1067 self._writenl = newline or os.linesep
1068 self._seennl = 0
Guido van Rossum78892e42007-04-06 17:31:18 +00001069 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +00001070 self._pending = ""
1071 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001072 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001073
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001074 @property
1075 def encoding(self):
1076 return self._encoding
1077
Guido van Rossum9b76da62007-04-11 01:09:03 +00001078 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001079 # tuple (decoder_state, readahead, pending) where decoder_state is
1080 # the second (integer) item of the decoder state, readahead is the
1081 # chunk of bytes that was read, and pending is the characters that
1082 # were rendered by the decoder after feeding it those bytes. We
1083 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001084
1085 def _seekable(self):
1086 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001087
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001088 def flush(self):
1089 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001090 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001091
1092 def close(self):
Guido van Rossum33e7a8e2007-07-22 20:38:07 +00001093 try:
1094 self.flush()
1095 except:
1096 pass # If flush() fails, just give up
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001097 self.buffer.close()
1098
1099 @property
1100 def closed(self):
1101 return self.buffer.closed
1102
Guido van Rossum9be55972007-04-07 02:59:27 +00001103 def fileno(self):
1104 return self.buffer.fileno()
1105
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001106 def isatty(self):
1107 return self.buffer.isatty()
1108
Guido van Rossum78892e42007-04-06 17:31:18 +00001109 def write(self, s: str):
Guido van Rossum4b5386f2007-07-10 09:12:49 +00001110 if self.closed:
1111 raise ValueError("write to closed file")
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001112 if not isinstance(s, str):
Guido van Rossumdcce8392007-08-29 18:10:08 +00001113 raise TypeError("can't write %s to text stream" %
1114 s.__class__.__name__)
Guido van Rossum8358db22007-08-18 21:39:55 +00001115 haslf = "\n" in s
1116 if haslf and self._writetranslate and self._writenl != "\n":
1117 s = s.replace("\n", self._writenl)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001118 # XXX What if we were just reading?
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001119 b = s.encode(self._encoding)
Guido van Rossum8358db22007-08-18 21:39:55 +00001120 self.buffer.write(b)
1121 if haslf and self.isatty():
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001122 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001123 self._snapshot = self._decoder = None
1124 return len(s)
Guido van Rossum78892e42007-04-06 17:31:18 +00001125
1126 def _get_decoder(self):
1127 make_decoder = codecs.getincrementaldecoder(self._encoding)
1128 if make_decoder is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001129 raise IOError("Can't find an incremental decoder for encoding %s" %
Guido van Rossum78892e42007-04-06 17:31:18 +00001130 self._encoding)
1131 decoder = self._decoder = make_decoder() # XXX: errors
Guido van Rossum78892e42007-04-06 17:31:18 +00001132 return decoder
1133
Guido van Rossum9b76da62007-04-11 01:09:03 +00001134 def _read_chunk(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +00001135 if self._decoder is None:
1136 raise ValueError("no decoder")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001137 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001138 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001139 pending = self._decoder.decode(readahead, not readahead)
1140 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001141 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001142 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001143 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001144 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001145 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001146
1147 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001148 x = 0
1149 for i in bytes(ds):
1150 x = x<<8 | i
1151 return (x<<64) | pos
1152
1153 def _decode_decoder_state(self, pos):
1154 x, pos = divmod(pos, 1<<64)
1155 if not x:
1156 return None, pos
1157 b = b""
1158 while x:
1159 b.append(x&0xff)
1160 x >>= 8
1161 return str(b[::-1]), pos
1162
1163 def tell(self):
1164 if not self._seekable:
1165 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001166 if not self._telling:
1167 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001168 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001169 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001170 decoder = self._decoder
1171 if decoder is None or self._snapshot is None:
Guido van Rossum5abbf752007-08-27 17:39:33 +00001172 if self._pending:
1173 raise ValueError("pending data")
Guido van Rossumcba608c2007-04-11 14:19:59 +00001174 return position
1175 decoder_state, readahead, pending = self._snapshot
1176 position -= len(readahead)
1177 needed = len(pending) - len(self._pending)
1178 if not needed:
1179 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001180 saved_state = decoder.getstate()
1181 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001182 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001183 n = 0
1184 bb = bytes(1)
1185 for i, bb[0] in enumerate(readahead):
1186 n += len(decoder.decode(bb))
1187 if n >= needed:
1188 decoder_buffer, decoder_state = decoder.getstate()
1189 return self._encode_decoder_state(
1190 decoder_state,
1191 position + (i+1) - len(decoder_buffer))
1192 raise IOError("Can't reconstruct logical file position")
1193 finally:
1194 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001195
1196 def seek(self, pos, whence=0):
1197 if not self._seekable:
1198 raise IOError("Underlying stream is not seekable")
1199 if whence == 1:
1200 if pos != 0:
1201 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001202 pos = self.tell()
1203 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001204 if whence == 2:
1205 if pos != 0:
1206 raise IOError("Can't do nonzero end-relative seeks")
1207 self.flush()
1208 pos = self.buffer.seek(0, 2)
1209 self._snapshot = None
1210 self._pending = ""
1211 self._decoder = None
1212 return pos
1213 if whence != 0:
1214 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1215 (whence,))
1216 if pos < 0:
1217 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001218 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001219 orig_pos = pos
1220 ds, pos = self._decode_decoder_state(pos)
1221 if not ds:
1222 self.buffer.seek(pos)
1223 self._snapshot = None
1224 self._pending = ""
1225 self._decoder = None
1226 return pos
Guido van Rossumd76e7792007-04-17 02:38:04 +00001227 decoder = self._decoder or self._get_decoder()
1228 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001229 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001230 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001231 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001232 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001233 return orig_pos
1234
Guido van Rossum024da5c2007-05-17 23:59:11 +00001235 def read(self, n=None):
1236 if n is None:
1237 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001238 decoder = self._decoder or self._get_decoder()
1239 res = self._pending
1240 if n < 0:
1241 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001242 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001243 self._snapshot = None
Guido van Rossum8358db22007-08-18 21:39:55 +00001244 return self._replacenl(res)
Guido van Rossum78892e42007-04-06 17:31:18 +00001245 else:
1246 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001247 readahead, pending = self._read_chunk()
1248 res += pending
1249 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001250 break
1251 self._pending = res[n:]
Guido van Rossum8358db22007-08-18 21:39:55 +00001252 return self._replacenl(res[:n])
Guido van Rossum78892e42007-04-06 17:31:18 +00001253
Guido van Rossum024da5c2007-05-17 23:59:11 +00001254 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001255 self._telling = False
1256 line = self.readline()
1257 if not line:
1258 self._snapshot = None
1259 self._telling = self._seekable
1260 raise StopIteration
1261 return line
1262
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001263 def readline(self, limit=None):
1264 if limit is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001265 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001266 line = self.readline()
1267 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001268 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001269 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001270 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001271
Guido van Rossum78892e42007-04-06 17:31:18 +00001272 line = self._pending
1273 start = 0
Guido van Rossum8358db22007-08-18 21:39:55 +00001274 cr_eof = False
Guido van Rossum78892e42007-04-06 17:31:18 +00001275 decoder = self._decoder or self._get_decoder()
1276
Guido van Rossum8358db22007-08-18 21:39:55 +00001277 pos = endpos = None
1278 ending = None
Guido van Rossum78892e42007-04-06 17:31:18 +00001279 while True:
Guido van Rossum8358db22007-08-18 21:39:55 +00001280 if self._readuniversal:
1281 # Universal newline search. Find any of \r, \r\n, \n
Guido van Rossum78892e42007-04-06 17:31:18 +00001282
Guido van Rossum8358db22007-08-18 21:39:55 +00001283 # In C we'd look for these in parallel of course.
1284 nlpos = line.find("\n", start)
1285 crpos = line.find("\r", start)
1286 if crpos == -1:
1287 if nlpos == -1:
1288 start = len(line)
Guido van Rossum78892e42007-04-06 17:31:18 +00001289 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001290 # Found \n
1291 pos = nlpos
1292 endpos = pos + 1
1293 ending = self._LF
1294 break
1295 elif nlpos == -1:
1296 if crpos == len(line) - 1:
1297 # Found \r at end of buffer, must keep reading
1298 start = crpos
1299 cr_eof = True
1300 else:
1301 # Found lone \r
1302 ending = self._CR
1303 pos = crpos
1304 endpos = pos + 1
1305 break
1306 elif nlpos < crpos:
1307 # Found \n
1308 pos = nlpos
1309 endpos = pos + 1
1310 ending = self._LF
Guido van Rossum78892e42007-04-06 17:31:18 +00001311 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001312 elif nlpos == crpos + 1:
1313 # Found \r\n
1314 ending = self._CRLF
1315 pos = crpos
1316 endpos = pos + 2
1317 break
1318 else:
1319 # Found \r
1320 pos = crpos
1321 endpos = pos + 1
1322 ending = self._CR
1323 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001324 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001325 # non-universal
1326 pos = line.find(self._readnl)
1327 if pos >= 0:
1328 endpos = pos+len(self._readnl)
1329 ending = self._nlflag(self._readnl)
1330 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001331
1332 # No line ending seen yet - get more data
Guido van Rossum8358db22007-08-18 21:39:55 +00001333 more_line = ''
Guido van Rossum78892e42007-04-06 17:31:18 +00001334 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001335 readahead, pending = self._read_chunk()
1336 more_line = pending
1337 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001338 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001339 if more_line:
1340 line += more_line
1341 else:
1342 # end of file
1343 self._pending = ''
1344 self._snapshot = None
1345 if cr_eof:
1346 self._seennl |= self._CR
1347 return line[:-1] + '\n'
1348 else:
1349 return line
Guido van Rossum78892e42007-04-06 17:31:18 +00001350
Guido van Rossum8358db22007-08-18 21:39:55 +00001351 self._pending = line[endpos:]
1352 if self._readtranslate:
1353 self._seennl |= ending
1354 if ending != self._LF:
1355 return line[:pos] + '\n'
1356 else:
1357 return line[:endpos]
Guido van Rossum78892e42007-04-06 17:31:18 +00001358 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001359 return line[:endpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001360
Guido van Rossum8358db22007-08-18 21:39:55 +00001361 def _replacenl(self, data):
1362 # Replace newlines in data as needed and record that they have
1363 # been seen.
1364 if not self._readtranslate:
1365 return data
1366 if self._readuniversal:
1367 crlf = data.count('\r\n')
1368 cr = data.count('\r') - crlf
1369 lf = data.count('\n') - crlf
1370 self._seennl |= (lf and self._LF) | (cr and self._CR) \
1371 | (crlf and self._CRLF)
1372 if crlf:
1373 data = data.replace("\r\n", "\n")
1374 if cr:
1375 data = data.replace("\r", "\n")
1376 elif self._readnl == '\n':
1377 # Only need to detect if \n was seen.
1378 if data.count('\n'):
1379 self._seennl |= self._LF
1380 else:
1381 newdata = data.replace(self._readnl, '\n')
1382 if newdata is not data:
1383 self._seennl |= self._nlflag(self._readnl)
1384 data = newdata
1385 return data
1386
1387 _LF = 1
1388 _CR = 2
1389 _CRLF = 4
1390 @property
1391 def newlines(self):
1392 return (None,
1393 "\n",
1394 "\r",
1395 ("\r", "\n"),
1396 "\r\n",
1397 ("\n", "\r\n"),
1398 ("\r", "\r\n"),
1399 ("\r", "\n", "\r\n")
1400 )[self._seennl]
1401
1402 def _nlflag(self, nlstr):
1403 return [None, "\n", "\r", None, "\r\n"].index(nlstr)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001404
1405class StringIO(TextIOWrapper):
1406
1407 # XXX This is really slow, but fully functional
1408
Guido van Rossume86254e2007-08-29 18:31:16 +00001409 def __init__(self, initial_value="", encoding="utf-8", newline="\n"):
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001410 super(StringIO, self).__init__(BytesIO(),
1411 encoding=encoding,
1412 newline=newline)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001413 if initial_value:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001414 if not isinstance(initial_value, str):
Guido van Rossum34d19282007-08-09 01:03:29 +00001415 initial_value = str(initial_value)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001416 self.write(initial_value)
1417 self.seek(0)
1418
1419 def getvalue(self):
Guido van Rossum34d19282007-08-09 01:03:29 +00001420 self.flush()
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001421 return self.buffer.getvalue().decode(self._encoding)