blob: b201cb2bb2b6645ad8eeccdf63e9e9368258022c [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 # On Windows, the truncate operation changes the current position
601 # to the end of the file, which may leave us with desynchronized
602 # buffers.
603 # Since we promise that truncate() won't change the current position,
604 # the easiest thing is to capture current pos now and seek back to
605 # it at the end.
606
607 initialpos = self.tell()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000608 if pos is None:
Guido van Rossum79b79ee2007-10-25 23:21:03 +0000609 pos = initialpos
610
611 # Flush the stream. We're mixing buffered I/O with lower-level I/O,
612 # and a flush may be necessary to synch both views of the current
613 # file state.
614 self.flush()
615 newpos = self.raw.truncate(pos)
616 self.seek(initialpos)
617 return newpos
Guido van Rossum141f7672007-04-10 00:22:16 +0000618
619 ### Flush and close ###
620
621 def flush(self):
622 self.raw.flush()
623
624 def close(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000625 if not self.closed:
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000626 try:
627 self.flush()
628 except IOError:
629 pass # If flush() fails, just give up
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000630 self.raw.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000631
632 ### Inquiries ###
633
634 def seekable(self):
635 return self.raw.seekable()
636
637 def readable(self):
638 return self.raw.readable()
639
640 def writable(self):
641 return self.raw.writable()
642
643 @property
644 def closed(self):
645 return self.raw.closed
646
647 ### Lower-level APIs ###
648
649 def fileno(self):
650 return self.raw.fileno()
651
652 def isatty(self):
653 return self.raw.isatty()
654
655
Guido van Rossum024da5c2007-05-17 23:59:11 +0000656class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000657
Guido van Rossum024da5c2007-05-17 23:59:11 +0000658 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000659
Guido van Rossum024da5c2007-05-17 23:59:11 +0000660 # XXX More docs
661
662 def __init__(self, initial_bytes=None):
663 buffer = b""
664 if initial_bytes is not None:
665 buffer += initial_bytes
Guido van Rossum78892e42007-04-06 17:31:18 +0000666 self._buffer = buffer
Guido van Rossum28524c72007-02-27 05:47:44 +0000667 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000668
669 def getvalue(self):
670 return self._buffer
671
Guido van Rossum024da5c2007-05-17 23:59:11 +0000672 def read(self, n=None):
673 if n is None:
674 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000675 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000676 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000677 newpos = min(len(self._buffer), self._pos + n)
678 b = self._buffer[self._pos : newpos]
679 self._pos = newpos
680 return b
681
Guido van Rossum024da5c2007-05-17 23:59:11 +0000682 def read1(self, n):
683 return self.read(n)
684
Guido van Rossum28524c72007-02-27 05:47:44 +0000685 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000686 if self.closed:
687 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000688 if isinstance(b, str):
689 raise TypeError("can't write str to binary stream")
Guido van Rossum28524c72007-02-27 05:47:44 +0000690 n = len(b)
691 newpos = self._pos + n
Guido van Rossumb972a782007-07-21 00:25:15 +0000692 if newpos > len(self._buffer):
693 # Inserts null bytes between the current end of the file
694 # and the new write position.
Guido van Rossuma74184e2007-08-29 04:05:57 +0000695 padding = b'\x00' * (newpos - len(self._buffer) - n)
Guido van Rossumb972a782007-07-21 00:25:15 +0000696 self._buffer[self._pos:newpos - n] = padding
Guido van Rossum28524c72007-02-27 05:47:44 +0000697 self._buffer[self._pos:newpos] = b
698 self._pos = newpos
699 return n
700
701 def seek(self, pos, whence=0):
702 if whence == 0:
703 self._pos = max(0, pos)
704 elif whence == 1:
705 self._pos = max(0, self._pos + pos)
706 elif whence == 2:
707 self._pos = max(0, len(self._buffer) + pos)
708 else:
709 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000710 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000711
712 def tell(self):
713 return self._pos
714
715 def truncate(self, pos=None):
716 if pos is None:
717 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000718 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000719 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000720
721 def readable(self):
722 return True
723
724 def writable(self):
725 return True
726
727 def seekable(self):
728 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000729
730
Guido van Rossum141f7672007-04-10 00:22:16 +0000731class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000732
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000733 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000734
Guido van Rossum78892e42007-04-06 17:31:18 +0000735 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000736 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000737 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000738 raw._checkReadable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000739 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000740 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000741 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000742
Guido van Rossum024da5c2007-05-17 23:59:11 +0000743 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000744 """Read n bytes.
745
746 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000747 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000748 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000749 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000750 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000751 if n is None:
752 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000753 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000754 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000755 to_read = max(self.buffer_size,
756 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000757 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000758 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000759 nodata_val = current
760 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000761 self._read_buf += current
762 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000763 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000764 n = len(self._read_buf)
765 out = self._read_buf[:n]
766 self._read_buf = self._read_buf[n:]
767 else:
768 out = nodata_val
769 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000770
Guido van Rossum13633bb2007-04-13 18:42:35 +0000771 def peek(self, n=0, *, unsafe=False):
772 """Returns buffered bytes without advancing the position.
773
774 The argument indicates a desired minimal number of bytes; we
775 do at most one raw read to satisfy it. We never return more
776 than self.buffer_size.
777
778 Unless unsafe=True is passed, we return a copy.
779 """
780 want = min(n, self.buffer_size)
781 have = len(self._read_buf)
782 if have < want:
783 to_read = self.buffer_size - have
784 current = self.raw.read(to_read)
785 if current:
786 self._read_buf += current
787 result = self._read_buf
788 if unsafe:
789 result = result[:]
790 return result
791
792 def read1(self, n):
793 """Reads up to n bytes.
794
795 Returns up to n bytes. If at least one byte is buffered,
796 we only return buffered bytes. Otherwise, we do one
797 raw read.
798 """
799 if n <= 0:
800 return b""
801 self.peek(1, unsafe=True)
802 return self.read(min(n, len(self._read_buf)))
803
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000804 def tell(self):
805 return self.raw.tell() - len(self._read_buf)
806
807 def seek(self, pos, whence=0):
808 if whence == 1:
809 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000810 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000811 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000812 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000813
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000814
Guido van Rossum141f7672007-04-10 00:22:16 +0000815class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000816
Guido van Rossum78892e42007-04-06 17:31:18 +0000817 # XXX docstring
818
Guido van Rossum141f7672007-04-10 00:22:16 +0000819 def __init__(self, raw,
820 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000821 raw._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000822 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000823 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000824 self.max_buffer_size = (2*buffer_size
825 if max_buffer_size is None
826 else max_buffer_size)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000827 self._write_buf = b""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000828
829 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000830 if self.closed:
831 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000832 if isinstance(b, str):
833 raise TypeError("can't write str to binary stream")
Guido van Rossum01a27522007-03-07 01:00:12 +0000834 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000835 if len(self._write_buf) > self.buffer_size:
836 # We're full, so let's pre-flush the buffer
837 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 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000841 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000842 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000843 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000844 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000845 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000846 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000847 try:
848 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000849 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000850 if (len(self._write_buf) > self.max_buffer_size):
851 # We've hit max_buffer_size. We have to accept a partial
852 # write and cut back our buffer.
853 overage = len(self._write_buf) - self.max_buffer_size
854 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000855 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000856 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000857
858 def flush(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000859 if self.closed:
860 raise ValueError("flush of closed file")
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000861 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000862 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000863 while self._write_buf:
864 n = self.raw.write(self._write_buf)
865 del self._write_buf[:n]
866 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000867 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000868 n = e.characters_written
869 del self._write_buf[:n]
870 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000871 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000872
873 def tell(self):
874 return self.raw.tell() + len(self._write_buf)
875
876 def seek(self, pos, whence=0):
877 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000878 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000879
Guido van Rossum01a27522007-03-07 01:00:12 +0000880
Guido van Rossum141f7672007-04-10 00:22:16 +0000881class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000882
Guido van Rossum01a27522007-03-07 01:00:12 +0000883 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000884
Guido van Rossum141f7672007-04-10 00:22:16 +0000885 A buffered reader object and buffered writer object put together
886 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000887
888 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000889
890 XXX The usefulness of this (compared to having two separate IO
891 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000892 """
893
Guido van Rossum141f7672007-04-10 00:22:16 +0000894 def __init__(self, reader, writer,
895 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
896 """Constructor.
897
898 The arguments are two RawIO instances.
899 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000900 reader._checkReadable()
901 writer._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000902 self.reader = BufferedReader(reader, buffer_size)
903 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000904
Guido van Rossum024da5c2007-05-17 23:59:11 +0000905 def read(self, n=None):
906 if n is None:
907 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000908 return self.reader.read(n)
909
Guido van Rossum141f7672007-04-10 00:22:16 +0000910 def readinto(self, b):
911 return self.reader.readinto(b)
912
Guido van Rossum01a27522007-03-07 01:00:12 +0000913 def write(self, b):
914 return self.writer.write(b)
915
Guido van Rossum13633bb2007-04-13 18:42:35 +0000916 def peek(self, n=0, *, unsafe=False):
917 return self.reader.peek(n, unsafe=unsafe)
918
919 def read1(self, n):
920 return self.reader.read1(n)
921
Guido van Rossum01a27522007-03-07 01:00:12 +0000922 def readable(self):
923 return self.reader.readable()
924
925 def writable(self):
926 return self.writer.writable()
927
928 def flush(self):
929 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000930
Guido van Rossum01a27522007-03-07 01:00:12 +0000931 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000932 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000933 self.reader.close()
934
935 def isatty(self):
936 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000937
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000938 @property
939 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000940 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000941
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000942
Guido van Rossum141f7672007-04-10 00:22:16 +0000943class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000944
Guido van Rossum78892e42007-04-06 17:31:18 +0000945 # XXX docstring
946
Guido van Rossum141f7672007-04-10 00:22:16 +0000947 def __init__(self, raw,
948 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000949 raw._checkSeekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000950 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000951 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
952
Guido van Rossum01a27522007-03-07 01:00:12 +0000953 def seek(self, pos, whence=0):
954 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000955 # First do the raw seek, then empty the read buffer, so that
956 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000957 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000958 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000959 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000960
961 def tell(self):
962 if (self._write_buf):
963 return self.raw.tell() + len(self._write_buf)
964 else:
965 return self.raw.tell() - len(self._read_buf)
966
Guido van Rossum024da5c2007-05-17 23:59:11 +0000967 def read(self, n=None):
968 if n is None:
969 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000970 self.flush()
971 return BufferedReader.read(self, n)
972
Guido van Rossum141f7672007-04-10 00:22:16 +0000973 def readinto(self, b):
974 self.flush()
975 return BufferedReader.readinto(self, b)
976
Guido van Rossum13633bb2007-04-13 18:42:35 +0000977 def peek(self, n=0, *, unsafe=False):
978 self.flush()
979 return BufferedReader.peek(self, n, unsafe=unsafe)
980
981 def read1(self, n):
982 self.flush()
983 return BufferedReader.read1(self, n)
984
Guido van Rossum01a27522007-03-07 01:00:12 +0000985 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +0000986 if self._read_buf:
987 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
988 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +0000989 return BufferedWriter.write(self, b)
990
Guido van Rossum78892e42007-04-06 17:31:18 +0000991
Guido van Rossumcce92b22007-04-10 14:41:39 +0000992class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +0000993
994 """Base class for text I/O.
995
996 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +0000997
998 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +0000999 """
1000
1001 def read(self, n: int = -1) -> str:
1002 """read(n: int = -1) -> str. Read at most n characters from stream.
1003
1004 Read from underlying buffer until we have n characters or we hit EOF.
1005 If n is negative or omitted, read until EOF.
1006 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001007 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +00001008
Guido van Rossum9b76da62007-04-11 01:09:03 +00001009 def write(self, s: str) -> int:
1010 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001011 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +00001012
Guido van Rossum9b76da62007-04-11 01:09:03 +00001013 def truncate(self, pos: int = None) -> int:
1014 """truncate(pos: int = None) -> int. Truncate size to pos."""
1015 self.flush()
1016 if pos is None:
1017 pos = self.tell()
1018 self.seek(pos)
1019 return self.buffer.truncate()
1020
Guido van Rossum78892e42007-04-06 17:31:18 +00001021 def readline(self) -> str:
1022 """readline() -> str. Read until newline or EOF.
1023
1024 Returns an empty string if EOF is hit immediately.
1025 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001026 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +00001027
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001028 @property
1029 def encoding(self):
1030 """Subclasses should override."""
1031 return None
1032
Guido van Rossum8358db22007-08-18 21:39:55 +00001033 @property
1034 def newlines(self):
1035 """newlines -> None | str | tuple of str. Line endings translated
1036 so far.
1037
1038 Only line endings translated during reading are considered.
1039
1040 Subclasses should override.
1041 """
1042 return None
1043
Guido van Rossum78892e42007-04-06 17:31:18 +00001044
1045class TextIOWrapper(TextIOBase):
1046
1047 """Buffered text stream.
1048
1049 Character and line based layer over a BufferedIOBase object.
1050 """
1051
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001052 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +00001053
1054 def __init__(self, buffer, encoding=None, newline=None):
Guido van Rossum8358db22007-08-18 21:39:55 +00001055 if newline not in (None, "", "\n", "\r", "\r\n"):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001056 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +00001057 if encoding is None:
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001058 try:
1059 encoding = os.device_encoding(buffer.fileno())
Brett Cannon041683d2007-10-11 23:08:53 +00001060 except (AttributeError, UnsupportedOperation):
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001061 pass
1062 if encoding is None:
Martin v. Löwisd78d3b42007-08-11 15:36:45 +00001063 try:
1064 import locale
1065 except ImportError:
1066 # Importing locale may fail if Python is being built
1067 encoding = "ascii"
1068 else:
1069 encoding = locale.getpreferredencoding()
Guido van Rossum78892e42007-04-06 17:31:18 +00001070
1071 self.buffer = buffer
1072 self._encoding = encoding
Guido van Rossum8358db22007-08-18 21:39:55 +00001073 self._readuniversal = not newline
1074 self._readtranslate = newline is None
1075 self._readnl = newline
1076 self._writetranslate = newline != ''
1077 self._writenl = newline or os.linesep
1078 self._seennl = 0
Guido van Rossum78892e42007-04-06 17:31:18 +00001079 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +00001080 self._pending = ""
1081 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001082 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001083
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001084 @property
1085 def encoding(self):
1086 return self._encoding
1087
Guido van Rossum9b76da62007-04-11 01:09:03 +00001088 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001089 # tuple (decoder_state, readahead, pending) where decoder_state is
1090 # the second (integer) item of the decoder state, readahead is the
1091 # chunk of bytes that was read, and pending is the characters that
1092 # were rendered by the decoder after feeding it those bytes. We
1093 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001094
1095 def _seekable(self):
1096 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001097
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001098 def flush(self):
1099 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001100 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001101
1102 def close(self):
Guido van Rossum33e7a8e2007-07-22 20:38:07 +00001103 try:
1104 self.flush()
1105 except:
1106 pass # If flush() fails, just give up
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001107 self.buffer.close()
1108
1109 @property
1110 def closed(self):
1111 return self.buffer.closed
1112
Guido van Rossum9be55972007-04-07 02:59:27 +00001113 def fileno(self):
1114 return self.buffer.fileno()
1115
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001116 def isatty(self):
1117 return self.buffer.isatty()
1118
Guido van Rossum78892e42007-04-06 17:31:18 +00001119 def write(self, s: str):
Guido van Rossum4b5386f2007-07-10 09:12:49 +00001120 if self.closed:
1121 raise ValueError("write to closed file")
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001122 if not isinstance(s, str):
Guido van Rossumdcce8392007-08-29 18:10:08 +00001123 raise TypeError("can't write %s to text stream" %
1124 s.__class__.__name__)
Guido van Rossum8358db22007-08-18 21:39:55 +00001125 haslf = "\n" in s
1126 if haslf and self._writetranslate and self._writenl != "\n":
1127 s = s.replace("\n", self._writenl)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001128 # XXX What if we were just reading?
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001129 b = s.encode(self._encoding)
Guido van Rossum8358db22007-08-18 21:39:55 +00001130 self.buffer.write(b)
1131 if haslf and self.isatty():
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001132 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001133 self._snapshot = self._decoder = None
1134 return len(s)
Guido van Rossum78892e42007-04-06 17:31:18 +00001135
1136 def _get_decoder(self):
1137 make_decoder = codecs.getincrementaldecoder(self._encoding)
1138 if make_decoder is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001139 raise IOError("Can't find an incremental decoder for encoding %s" %
Guido van Rossum78892e42007-04-06 17:31:18 +00001140 self._encoding)
1141 decoder = self._decoder = make_decoder() # XXX: errors
Guido van Rossum78892e42007-04-06 17:31:18 +00001142 return decoder
1143
Guido van Rossum9b76da62007-04-11 01:09:03 +00001144 def _read_chunk(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +00001145 if self._decoder is None:
1146 raise ValueError("no decoder")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001147 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001148 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001149 pending = self._decoder.decode(readahead, not readahead)
1150 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001151 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001152 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001153 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001154 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001155 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001156
1157 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001158 x = 0
1159 for i in bytes(ds):
1160 x = x<<8 | i
1161 return (x<<64) | pos
1162
1163 def _decode_decoder_state(self, pos):
1164 x, pos = divmod(pos, 1<<64)
1165 if not x:
1166 return None, pos
1167 b = b""
1168 while x:
1169 b.append(x&0xff)
1170 x >>= 8
1171 return str(b[::-1]), pos
1172
1173 def tell(self):
1174 if not self._seekable:
1175 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001176 if not self._telling:
1177 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001178 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001179 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001180 decoder = self._decoder
1181 if decoder is None or self._snapshot is None:
Guido van Rossum5abbf752007-08-27 17:39:33 +00001182 if self._pending:
1183 raise ValueError("pending data")
Guido van Rossumcba608c2007-04-11 14:19:59 +00001184 return position
1185 decoder_state, readahead, pending = self._snapshot
1186 position -= len(readahead)
1187 needed = len(pending) - len(self._pending)
1188 if not needed:
1189 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001190 saved_state = decoder.getstate()
1191 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001192 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001193 n = 0
1194 bb = bytes(1)
1195 for i, bb[0] in enumerate(readahead):
1196 n += len(decoder.decode(bb))
1197 if n >= needed:
1198 decoder_buffer, decoder_state = decoder.getstate()
1199 return self._encode_decoder_state(
1200 decoder_state,
1201 position + (i+1) - len(decoder_buffer))
1202 raise IOError("Can't reconstruct logical file position")
1203 finally:
1204 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001205
1206 def seek(self, pos, whence=0):
1207 if not self._seekable:
1208 raise IOError("Underlying stream is not seekable")
1209 if whence == 1:
1210 if pos != 0:
1211 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001212 pos = self.tell()
1213 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001214 if whence == 2:
1215 if pos != 0:
1216 raise IOError("Can't do nonzero end-relative seeks")
1217 self.flush()
1218 pos = self.buffer.seek(0, 2)
1219 self._snapshot = None
1220 self._pending = ""
1221 self._decoder = None
1222 return pos
1223 if whence != 0:
1224 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1225 (whence,))
1226 if pos < 0:
1227 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001228 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001229 orig_pos = pos
1230 ds, pos = self._decode_decoder_state(pos)
1231 if not ds:
1232 self.buffer.seek(pos)
1233 self._snapshot = None
1234 self._pending = ""
1235 self._decoder = None
1236 return pos
Guido van Rossumd76e7792007-04-17 02:38:04 +00001237 decoder = self._decoder or self._get_decoder()
1238 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001239 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001240 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001241 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001242 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001243 return orig_pos
1244
Guido van Rossum024da5c2007-05-17 23:59:11 +00001245 def read(self, n=None):
1246 if n is None:
1247 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001248 decoder = self._decoder or self._get_decoder()
1249 res = self._pending
1250 if n < 0:
1251 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001252 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001253 self._snapshot = None
Guido van Rossum8358db22007-08-18 21:39:55 +00001254 return self._replacenl(res)
Guido van Rossum78892e42007-04-06 17:31:18 +00001255 else:
1256 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001257 readahead, pending = self._read_chunk()
1258 res += pending
1259 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001260 break
1261 self._pending = res[n:]
Guido van Rossum8358db22007-08-18 21:39:55 +00001262 return self._replacenl(res[:n])
Guido van Rossum78892e42007-04-06 17:31:18 +00001263
Guido van Rossum024da5c2007-05-17 23:59:11 +00001264 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001265 self._telling = False
1266 line = self.readline()
1267 if not line:
1268 self._snapshot = None
1269 self._telling = self._seekable
1270 raise StopIteration
1271 return line
1272
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001273 def readline(self, limit=None):
1274 if limit is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001275 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001276 line = self.readline()
1277 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001278 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001279 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001280 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001281
Guido van Rossum78892e42007-04-06 17:31:18 +00001282 line = self._pending
1283 start = 0
Guido van Rossum8358db22007-08-18 21:39:55 +00001284 cr_eof = False
Guido van Rossum78892e42007-04-06 17:31:18 +00001285 decoder = self._decoder or self._get_decoder()
1286
Guido van Rossum8358db22007-08-18 21:39:55 +00001287 pos = endpos = None
1288 ending = None
Guido van Rossum78892e42007-04-06 17:31:18 +00001289 while True:
Guido van Rossum8358db22007-08-18 21:39:55 +00001290 if self._readuniversal:
1291 # Universal newline search. Find any of \r, \r\n, \n
Guido van Rossum78892e42007-04-06 17:31:18 +00001292
Guido van Rossum8358db22007-08-18 21:39:55 +00001293 # In C we'd look for these in parallel of course.
1294 nlpos = line.find("\n", start)
1295 crpos = line.find("\r", start)
1296 if crpos == -1:
1297 if nlpos == -1:
1298 start = len(line)
Guido van Rossum78892e42007-04-06 17:31:18 +00001299 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001300 # Found \n
1301 pos = nlpos
1302 endpos = pos + 1
1303 ending = self._LF
1304 break
1305 elif nlpos == -1:
1306 if crpos == len(line) - 1:
1307 # Found \r at end of buffer, must keep reading
1308 start = crpos
1309 cr_eof = True
1310 else:
1311 # Found lone \r
1312 ending = self._CR
1313 pos = crpos
1314 endpos = pos + 1
1315 break
1316 elif nlpos < crpos:
1317 # Found \n
1318 pos = nlpos
1319 endpos = pos + 1
1320 ending = self._LF
Guido van Rossum78892e42007-04-06 17:31:18 +00001321 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001322 elif nlpos == crpos + 1:
1323 # Found \r\n
1324 ending = self._CRLF
1325 pos = crpos
1326 endpos = pos + 2
1327 break
1328 else:
1329 # Found \r
1330 pos = crpos
1331 endpos = pos + 1
1332 ending = self._CR
1333 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001334 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001335 # non-universal
1336 pos = line.find(self._readnl)
1337 if pos >= 0:
1338 endpos = pos+len(self._readnl)
1339 ending = self._nlflag(self._readnl)
1340 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001341
1342 # No line ending seen yet - get more data
Guido van Rossum8358db22007-08-18 21:39:55 +00001343 more_line = ''
Guido van Rossum78892e42007-04-06 17:31:18 +00001344 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001345 readahead, pending = self._read_chunk()
1346 more_line = pending
1347 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001348 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001349 if more_line:
1350 line += more_line
1351 else:
1352 # end of file
1353 self._pending = ''
1354 self._snapshot = None
1355 if cr_eof:
1356 self._seennl |= self._CR
1357 return line[:-1] + '\n'
1358 else:
1359 return line
Guido van Rossum78892e42007-04-06 17:31:18 +00001360
Guido van Rossum8358db22007-08-18 21:39:55 +00001361 self._pending = line[endpos:]
1362 if self._readtranslate:
1363 self._seennl |= ending
1364 if ending != self._LF:
1365 return line[:pos] + '\n'
1366 else:
1367 return line[:endpos]
Guido van Rossum78892e42007-04-06 17:31:18 +00001368 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001369 return line[:endpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001370
Guido van Rossum8358db22007-08-18 21:39:55 +00001371 def _replacenl(self, data):
1372 # Replace newlines in data as needed and record that they have
1373 # been seen.
1374 if not self._readtranslate:
1375 return data
1376 if self._readuniversal:
1377 crlf = data.count('\r\n')
1378 cr = data.count('\r') - crlf
1379 lf = data.count('\n') - crlf
1380 self._seennl |= (lf and self._LF) | (cr and self._CR) \
1381 | (crlf and self._CRLF)
1382 if crlf:
1383 data = data.replace("\r\n", "\n")
1384 if cr:
1385 data = data.replace("\r", "\n")
1386 elif self._readnl == '\n':
1387 # Only need to detect if \n was seen.
1388 if data.count('\n'):
1389 self._seennl |= self._LF
1390 else:
1391 newdata = data.replace(self._readnl, '\n')
1392 if newdata is not data:
1393 self._seennl |= self._nlflag(self._readnl)
1394 data = newdata
1395 return data
1396
1397 _LF = 1
1398 _CR = 2
1399 _CRLF = 4
1400 @property
1401 def newlines(self):
1402 return (None,
1403 "\n",
1404 "\r",
1405 ("\r", "\n"),
1406 "\r\n",
1407 ("\n", "\r\n"),
1408 ("\r", "\r\n"),
1409 ("\r", "\n", "\r\n")
1410 )[self._seennl]
1411
1412 def _nlflag(self, nlstr):
1413 return [None, "\n", "\r", None, "\r\n"].index(nlstr)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001414
1415class StringIO(TextIOWrapper):
1416
1417 # XXX This is really slow, but fully functional
1418
Guido van Rossume86254e2007-08-29 18:31:16 +00001419 def __init__(self, initial_value="", encoding="utf-8", newline="\n"):
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001420 super(StringIO, self).__init__(BytesIO(),
1421 encoding=encoding,
1422 newline=newline)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001423 if initial_value:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001424 if not isinstance(initial_value, str):
Guido van Rossum34d19282007-08-09 01:03:29 +00001425 initial_value = str(initial_value)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001426 self.write(initial_value)
1427 self.seek(0)
1428
1429 def getvalue(self):
Guido van Rossum34d19282007-08-09 01:03:29 +00001430 self.flush()
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001431 return self.buffer.getvalue().decode(self._encoding)