blob: e427fe6969ab535239deef17a53652f8779a7866 [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 Rossume7fc50f2007-12-03 22:54:21 +000052def open(file, mode="r", buffering=None, encoding=None, errors=None,
53 newline=None, closefd=True):
Brett Cannon7648ba82007-10-15 20:52:41 +000054 r"""Replacement for the built-in open function.
Guido van Rossum17e43e52007-02-27 15:45:13 +000055
56 Args:
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000057 file: string giving the name of the file to be opened;
Guido van Rossum9b76da62007-04-11 01:09:03 +000058 or integer file descriptor of the file to be wrapped (*).
59 mode: optional mode string; see below.
Guido van Rossum17e43e52007-02-27 15:45:13 +000060 buffering: optional int >= 0 giving the buffer size; values
61 can be: 0 = unbuffered, 1 = line buffered,
Guido van Rossum9b76da62007-04-11 01:09:03 +000062 larger = fully buffered.
Guido van Rossum9b76da62007-04-11 01:09:03 +000063 encoding: optional string giving the text encoding.
Guido van Rossume7fc50f2007-12-03 22:54:21 +000064 errors: optional string giving the encoding error handling.
Guido van Rossum8358db22007-08-18 21:39:55 +000065 newline: optional newlines specifier; must be None, '', '\n', '\r'
66 or '\r\n'; all other values are illegal. It controls the
67 handling of line endings. It works as follows:
68
69 * On input, if `newline` is `None`, universal newlines
70 mode is enabled. Lines in the input can end in `'\n'`,
71 `'\r'`, or `'\r\n'`, and these are translated into
72 `'\n'` before being returned to the caller. If it is
73 `''`, universal newline mode is enabled, but line endings
74 are returned to the caller untranslated. If it has any of
75 the other legal values, input lines are only terminated by
76 the given string, and the line ending is returned to the
77 caller untranslated.
78
79 * On output, if `newline` is `None`, any `'\n'`
80 characters written are translated to the system default
81 line separator, `os.linesep`. If `newline` is `''`,
82 no translation takes place. If `newline` is any of the
83 other legal values, any `'\n'` characters written are
84 translated to the given string.
Guido van Rossum17e43e52007-02-27 15:45:13 +000085
Guido van Rossum2dced8b2007-10-30 17:27:30 +000086 closefd: optional argument to keep the underlying file descriptor
87 open when the file is closed. It must not be false when
88 a filename is given.
89
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000090 (*) If a file descriptor is given, it is closed when the returned
Georg Brandl316414e2007-10-30 17:42:20 +000091 I/O object is closed, unless closefd=False is given.
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000092
Guido van Rossum17e43e52007-02-27 15:45:13 +000093 Mode strings characters:
94 'r': open for reading (default)
95 'w': open for writing, truncating the file first
96 'a': open for writing, appending to the end if the file exists
97 'b': binary mode
98 't': text mode (default)
99 '+': open a disk file for updating (implies reading and writing)
Guido van Rossum9be55972007-04-07 02:59:27 +0000100 'U': universal newline mode (for backwards compatibility)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000101
102 Constraints:
Guido van Rossume7fc50f2007-12-03 22:54:21 +0000103 - encoding or errors must not be given when a binary mode is given
Guido van Rossum17e43e52007-02-27 15:45:13 +0000104 - buffering must not be zero when a text mode is given
105
106 Returns:
107 Depending on the mode and buffering arguments, either a raw
108 binary stream, a buffered binary stream, or a buffered text
109 stream, open for reading and/or writing.
110 """
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000111 if not isinstance(file, (str, int)):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000112 raise TypeError("invalid file: %r" % file)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000113 if not isinstance(mode, str):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000114 raise TypeError("invalid mode: %r" % mode)
115 if buffering is not None and not isinstance(buffering, int):
116 raise TypeError("invalid buffering: %r" % buffering)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000117 if encoding is not None and not isinstance(encoding, str):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000118 raise TypeError("invalid encoding: %r" % encoding)
Guido van Rossume7fc50f2007-12-03 22:54:21 +0000119 if errors is not None and not isinstance(errors, str):
120 raise TypeError("invalid errors: %r" % errors)
Guido van Rossum28524c72007-02-27 05:47:44 +0000121 modes = set(mode)
Guido van Rossum9be55972007-04-07 02:59:27 +0000122 if modes - set("arwb+tU") or len(mode) > len(modes):
Guido van Rossum28524c72007-02-27 05:47:44 +0000123 raise ValueError("invalid mode: %r" % mode)
124 reading = "r" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000125 writing = "w" in modes
Guido van Rossum28524c72007-02-27 05:47:44 +0000126 appending = "a" in modes
127 updating = "+" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000128 text = "t" in modes
129 binary = "b" in modes
Guido van Rossum7165cb12007-07-10 06:54:34 +0000130 if "U" in modes:
131 if writing or appending:
132 raise ValueError("can't use U and writing mode at once")
Guido van Rossum9be55972007-04-07 02:59:27 +0000133 reading = True
Guido van Rossum28524c72007-02-27 05:47:44 +0000134 if text and binary:
135 raise ValueError("can't have text and binary mode at once")
136 if reading + writing + appending > 1:
137 raise ValueError("can't have read/write/append mode at once")
138 if not (reading or writing or appending):
139 raise ValueError("must have exactly one of read/write/append mode")
140 if binary and encoding is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +0000141 raise ValueError("binary mode doesn't take an encoding argument")
Guido van Rossume7fc50f2007-12-03 22:54:21 +0000142 if binary and errors is not None:
143 raise ValueError("binary mode doesn't take an errors argument")
Guido van Rossum9b76da62007-04-11 01:09:03 +0000144 if binary and newline is not None:
145 raise ValueError("binary mode doesn't take a newline argument")
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000146 raw = FileIO(file,
Guido van Rossum28524c72007-02-27 05:47:44 +0000147 (reading and "r" or "") +
148 (writing and "w" or "") +
149 (appending and "a" or "") +
Guido van Rossum2dced8b2007-10-30 17:27:30 +0000150 (updating and "+" or ""),
151 closefd)
Guido van Rossum28524c72007-02-27 05:47:44 +0000152 if buffering is None:
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000153 buffering = -1
Guido van Rossumf64db9f2007-12-06 01:04:26 +0000154 line_buffering = False
155 if buffering == 1 or buffering < 0 and raw.isatty():
156 buffering = -1
157 line_buffering = True
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000158 if buffering < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000159 buffering = DEFAULT_BUFFER_SIZE
Guido van Rossum17e43e52007-02-27 15:45:13 +0000160 try:
161 bs = os.fstat(raw.fileno()).st_blksize
162 except (os.error, AttributeError):
Guido van Rossumbb09b212007-03-18 03:36:28 +0000163 pass
164 else:
Guido van Rossum17e43e52007-02-27 15:45:13 +0000165 if bs > 1:
166 buffering = bs
Guido van Rossum28524c72007-02-27 05:47:44 +0000167 if buffering < 0:
168 raise ValueError("invalid buffering size")
169 if buffering == 0:
170 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000171 raw._name = file
172 raw._mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000173 return raw
174 raise ValueError("can't have unbuffered text I/O")
175 if updating:
176 buffer = BufferedRandom(raw, buffering)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000177 elif writing or appending:
Guido van Rossum28524c72007-02-27 05:47:44 +0000178 buffer = BufferedWriter(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000179 elif reading:
Guido van Rossum28524c72007-02-27 05:47:44 +0000180 buffer = BufferedReader(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000181 else:
182 raise ValueError("unknown mode: %r" % mode)
Guido van Rossum28524c72007-02-27 05:47:44 +0000183 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000184 buffer.name = file
185 buffer.mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000186 return buffer
Guido van Rossumf64db9f2007-12-06 01:04:26 +0000187 text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000188 text.name = file
189 text.mode = mode
190 return text
Guido van Rossum28524c72007-02-27 05:47:44 +0000191
Christian Heimesa33eb062007-12-08 17:47:40 +0000192class _DocDescriptor:
193 """Helper for builtins.open.__doc__
194 """
195 def __get__(self, obj, typ):
196 return (
197 "open(file, mode='r', buffering=None, encoding=None, "
198 "errors=None, newline=None, closefd=True)\n\n" +
199 open.__doc__)
Guido van Rossum28524c72007-02-27 05:47:44 +0000200
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000201class OpenWrapper:
Georg Brandl1a3284e2007-12-02 09:40:06 +0000202 """Wrapper for builtins.open
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000203
204 Trick so that open won't become a bound method when stored
205 as a class variable (as dumbdbm does).
206
207 See initstdio() in Python/pythonrun.c.
208 """
Christian Heimesa33eb062007-12-08 17:47:40 +0000209 __doc__ = _DocDescriptor()
210
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000211 def __new__(cls, *args, **kwargs):
212 return open(*args, **kwargs)
213
214
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000215class UnsupportedOperation(ValueError, IOError):
216 pass
217
218
Guido van Rossumb7f136e2007-08-22 18:14:10 +0000219class IOBase(metaclass=abc.ABCMeta):
Guido van Rossum28524c72007-02-27 05:47:44 +0000220
Guido van Rossum141f7672007-04-10 00:22:16 +0000221 """Base class for all I/O classes.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000222
Guido van Rossum141f7672007-04-10 00:22:16 +0000223 This class provides dummy implementations for many methods that
Guido van Rossum17e43e52007-02-27 15:45:13 +0000224 derived classes can override selectively; the default
225 implementations represent a file that cannot be read, written or
226 seeked.
227
Guido van Rossum141f7672007-04-10 00:22:16 +0000228 This does not define read(), readinto() and write(), nor
229 readline() and friends, since their signatures vary per layer.
Guido van Rossum53807da2007-04-10 19:01:47 +0000230
231 Not that calling any method (even inquiries) on a closed file is
232 undefined. Implementations may raise IOError in this case.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000233 """
234
Guido van Rossum141f7672007-04-10 00:22:16 +0000235 ### Internal ###
236
237 def _unsupported(self, name: str) -> IOError:
238 """Internal: raise an exception for unsupported operations."""
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000239 raise UnsupportedOperation("%s.%s() not supported" %
240 (self.__class__.__name__, name))
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000241
Guido van Rossum141f7672007-04-10 00:22:16 +0000242 ### Positioning ###
243
Guido van Rossum53807da2007-04-10 19:01:47 +0000244 def seek(self, pos: int, whence: int = 0) -> int:
245 """seek(pos: int, whence: int = 0) -> int. Change stream position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000246
247 Seek to byte offset pos relative to position indicated by whence:
248 0 Start of stream (the default). pos should be >= 0;
249 1 Current position - whence may be negative;
250 2 End of stream - whence usually negative.
Guido van Rossum53807da2007-04-10 19:01:47 +0000251 Returns the new absolute position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000252 """
253 self._unsupported("seek")
254
255 def tell(self) -> int:
256 """tell() -> int. Return current stream position."""
Guido van Rossum53807da2007-04-10 19:01:47 +0000257 return self.seek(0, 1)
Guido van Rossum141f7672007-04-10 00:22:16 +0000258
Guido van Rossum87429772007-04-10 21:06:59 +0000259 def truncate(self, pos: int = None) -> int:
260 """truncate(size: int = None) -> int. Truncate file to size bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000261
262 Size defaults to the current IO position as reported by tell().
Guido van Rossum87429772007-04-10 21:06:59 +0000263 Returns the new size.
Guido van Rossum141f7672007-04-10 00:22:16 +0000264 """
265 self._unsupported("truncate")
266
267 ### Flush and close ###
268
269 def flush(self) -> None:
270 """flush() -> None. Flushes write buffers, if applicable.
271
272 This is a no-op for read-only and non-blocking streams.
273 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000274 # XXX Should this return the number of bytes written???
Guido van Rossum141f7672007-04-10 00:22:16 +0000275
276 __closed = False
277
278 def close(self) -> None:
279 """close() -> None. Flushes and closes the IO object.
280
281 This must be idempotent. It should also set a flag for the
282 'closed' property (see below) to test.
283 """
284 if not self.__closed:
Guido van Rossum469734b2007-07-10 12:00:45 +0000285 try:
286 self.flush()
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000287 except IOError:
288 pass # If flush() fails, just give up
289 self.__closed = True
Guido van Rossum141f7672007-04-10 00:22:16 +0000290
291 def __del__(self) -> None:
292 """Destructor. Calls close()."""
293 # The try/except block is in case this is called at program
294 # exit time, when it's possible that globals have already been
295 # deleted, and then the close() call might fail. Since
296 # there's nothing we can do about such failures and they annoy
297 # the end users, we suppress the traceback.
298 try:
299 self.close()
300 except:
301 pass
302
303 ### Inquiries ###
304
305 def seekable(self) -> bool:
306 """seekable() -> bool. Return whether object supports random access.
307
308 If False, seek(), tell() and truncate() will raise IOError.
309 This method may need to do a test seek().
310 """
311 return False
312
Guido van Rossum5abbf752007-08-27 17:39:33 +0000313 def _checkSeekable(self, msg=None):
314 """Internal: raise an IOError if file is not seekable
315 """
316 if not self.seekable():
317 raise IOError("File or stream is not seekable."
318 if msg is None else msg)
319
320
Guido van Rossum141f7672007-04-10 00:22:16 +0000321 def readable(self) -> bool:
322 """readable() -> bool. Return whether object was opened for reading.
323
324 If False, read() will raise IOError.
325 """
326 return False
327
Guido van Rossum5abbf752007-08-27 17:39:33 +0000328 def _checkReadable(self, msg=None):
329 """Internal: raise an IOError if file is not readable
330 """
331 if not self.readable():
332 raise IOError("File or stream is not readable."
333 if msg is None else msg)
334
Guido van Rossum141f7672007-04-10 00:22:16 +0000335 def writable(self) -> bool:
336 """writable() -> bool. Return whether object was opened for writing.
337
338 If False, write() and truncate() will raise IOError.
339 """
340 return False
341
Guido van Rossum5abbf752007-08-27 17:39:33 +0000342 def _checkWritable(self, msg=None):
343 """Internal: raise an IOError if file is not writable
344 """
345 if not self.writable():
346 raise IOError("File or stream is not writable."
347 if msg is None else msg)
348
Guido van Rossum141f7672007-04-10 00:22:16 +0000349 @property
350 def closed(self):
351 """closed: bool. True iff the file has been closed.
352
353 For backwards compatibility, this is a property, not a predicate.
354 """
355 return self.__closed
356
Guido van Rossum5abbf752007-08-27 17:39:33 +0000357 def _checkClosed(self, msg=None):
358 """Internal: raise an ValueError if file is closed
359 """
360 if self.closed:
361 raise ValueError("I/O operation on closed file."
362 if msg is None else msg)
363
Guido van Rossum141f7672007-04-10 00:22:16 +0000364 ### Context manager ###
365
366 def __enter__(self) -> "IOBase": # That's a forward reference
367 """Context management protocol. Returns self."""
368 return self
369
370 def __exit__(self, *args) -> None:
371 """Context management protocol. Calls close()"""
372 self.close()
373
374 ### Lower-level APIs ###
375
376 # XXX Should these be present even if unimplemented?
377
378 def fileno(self) -> int:
379 """fileno() -> int. Returns underlying file descriptor if one exists.
380
381 Raises IOError if the IO object does not use a file descriptor.
382 """
383 self._unsupported("fileno")
384
385 def isatty(self) -> bool:
386 """isatty() -> int. Returns whether this is an 'interactive' stream.
387
388 Returns False if we don't know.
389 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000390 self._checkClosed()
Guido van Rossum141f7672007-04-10 00:22:16 +0000391 return False
392
Guido van Rossum7165cb12007-07-10 06:54:34 +0000393 ### Readline[s] and writelines ###
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000394
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000395 def readline(self, limit: int = -1) -> bytes:
396 """For backwards compatibility, a (slowish) readline()."""
Guido van Rossum2bf71382007-06-08 00:07:57 +0000397 if hasattr(self, "peek"):
398 def nreadahead():
399 readahead = self.peek(1, unsafe=True)
400 if not readahead:
401 return 1
402 n = (readahead.find(b"\n") + 1) or len(readahead)
403 if limit >= 0:
404 n = min(n, limit)
405 return n
406 else:
407 def nreadahead():
408 return 1
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000409 if limit is None:
410 limit = -1
Guido van Rossum254348e2007-11-21 19:29:53 +0000411 res = bytearray()
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000412 while limit < 0 or len(res) < limit:
Guido van Rossum2bf71382007-06-08 00:07:57 +0000413 b = self.read(nreadahead())
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000414 if not b:
415 break
416 res += b
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000417 if res.endswith(b"\n"):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000418 break
Guido van Rossum98297ee2007-11-06 21:34:58 +0000419 return bytes(res)
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000420
Guido van Rossum7165cb12007-07-10 06:54:34 +0000421 def __iter__(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000422 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000423 return self
424
425 def __next__(self):
426 line = self.readline()
427 if not line:
428 raise StopIteration
429 return line
430
431 def readlines(self, hint=None):
432 if hint is None:
433 return list(self)
434 n = 0
435 lines = []
436 for line in self:
437 lines.append(line)
438 n += len(line)
439 if n >= hint:
440 break
441 return lines
442
443 def writelines(self, lines):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000444 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000445 for line in lines:
446 self.write(line)
447
Guido van Rossum141f7672007-04-10 00:22:16 +0000448
449class RawIOBase(IOBase):
450
451 """Base class for raw binary I/O.
452
453 The read() method is implemented by calling readinto(); derived
454 classes that want to support read() only need to implement
455 readinto() as a primitive operation. In general, readinto()
456 can be more efficient than read().
457
458 (It would be tempting to also provide an implementation of
459 readinto() in terms of read(), in case the latter is a more
460 suitable primitive operation, but that would lead to nasty
461 recursion in case a subclass doesn't implement either.)
462 """
463
Guido van Rossum7165cb12007-07-10 06:54:34 +0000464 def read(self, n: int = -1) -> bytes:
Guido van Rossum78892e42007-04-06 17:31:18 +0000465 """read(n: int) -> bytes. Read and return up to n bytes.
Guido van Rossum01a27522007-03-07 01:00:12 +0000466
467 Returns an empty bytes array on EOF, or None if the object is
468 set not to block and has no data to read.
469 """
Guido van Rossum7165cb12007-07-10 06:54:34 +0000470 if n is None:
471 n = -1
472 if n < 0:
473 return self.readall()
Guido van Rossum254348e2007-11-21 19:29:53 +0000474 b = bytearray(n.__index__())
Guido van Rossum00efead2007-03-07 05:23:25 +0000475 n = self.readinto(b)
476 del b[n:]
Guido van Rossum98297ee2007-11-06 21:34:58 +0000477 return bytes(b)
Guido van Rossum28524c72007-02-27 05:47:44 +0000478
Guido van Rossum7165cb12007-07-10 06:54:34 +0000479 def readall(self):
480 """readall() -> bytes. Read until EOF, using multiple read() call."""
Guido van Rossum254348e2007-11-21 19:29:53 +0000481 res = bytearray()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000482 while True:
483 data = self.read(DEFAULT_BUFFER_SIZE)
484 if not data:
485 break
486 res += data
Guido van Rossum98297ee2007-11-06 21:34:58 +0000487 return bytes(res)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000488
Guido van Rossum141f7672007-04-10 00:22:16 +0000489 def readinto(self, b: bytes) -> int:
490 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
Guido van Rossum78892e42007-04-06 17:31:18 +0000491
492 Returns number of bytes read (0 for EOF), or None if the object
493 is set not to block as has no data to read.
494 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000495 self._unsupported("readinto")
Guido van Rossum28524c72007-02-27 05:47:44 +0000496
Guido van Rossum141f7672007-04-10 00:22:16 +0000497 def write(self, b: bytes) -> int:
Guido van Rossum78892e42007-04-06 17:31:18 +0000498 """write(b: bytes) -> int. Write the given buffer to the IO stream.
Guido van Rossum01a27522007-03-07 01:00:12 +0000499
Guido van Rossum78892e42007-04-06 17:31:18 +0000500 Returns the number of bytes written, which may be less than len(b).
Guido van Rossum01a27522007-03-07 01:00:12 +0000501 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000502 self._unsupported("write")
Guido van Rossum28524c72007-02-27 05:47:44 +0000503
Guido van Rossum78892e42007-04-06 17:31:18 +0000504
Guido van Rossum141f7672007-04-10 00:22:16 +0000505class FileIO(_fileio._FileIO, RawIOBase):
Guido van Rossum28524c72007-02-27 05:47:44 +0000506
Guido van Rossum141f7672007-04-10 00:22:16 +0000507 """Raw I/O implementation for OS files.
Guido van Rossum28524c72007-02-27 05:47:44 +0000508
Guido van Rossum141f7672007-04-10 00:22:16 +0000509 This multiply inherits from _FileIO and RawIOBase to make
510 isinstance(io.FileIO(), io.RawIOBase) return True without
511 requiring that _fileio._FileIO inherits from io.RawIOBase (which
512 would be hard to do since _fileio.c is written in C).
513 """
Guido van Rossuma9e20242007-03-08 00:43:48 +0000514
Guido van Rossum87429772007-04-10 21:06:59 +0000515 def close(self):
516 _fileio._FileIO.close(self)
517 RawIOBase.close(self)
518
Guido van Rossum13633bb2007-04-13 18:42:35 +0000519 @property
520 def name(self):
521 return self._name
522
523 @property
524 def mode(self):
525 return self._mode
526
Guido van Rossuma9e20242007-03-08 00:43:48 +0000527
Guido van Rossumcce92b22007-04-10 14:41:39 +0000528class BufferedIOBase(IOBase):
Guido van Rossum141f7672007-04-10 00:22:16 +0000529
530 """Base class for buffered IO objects.
531
532 The main difference with RawIOBase is that the read() method
533 supports omitting the size argument, and does not have a default
534 implementation that defers to readinto().
535
536 In addition, read(), readinto() and write() may raise
537 BlockingIOError if the underlying raw stream is in non-blocking
538 mode and not ready; unlike their raw counterparts, they will never
539 return None.
540
541 A typical implementation should not inherit from a RawIOBase
542 implementation, but wrap one.
543 """
544
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000545 def read(self, n: int = None) -> bytes:
546 """read(n: int = None) -> bytes. Read and return up to n bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000547
Guido van Rossum024da5c2007-05-17 23:59:11 +0000548 If the argument is omitted, None, or negative, reads and
549 returns all data until EOF.
Guido van Rossum141f7672007-04-10 00:22:16 +0000550
551 If the argument is positive, and the underlying raw stream is
552 not 'interactive', multiple raw reads may be issued to satisfy
553 the byte count (unless EOF is reached first). But for
554 interactive raw streams (XXX and for pipes?), at most one raw
555 read will be issued, and a short result does not imply that
556 EOF is imminent.
557
558 Returns an empty bytes array on EOF.
559
560 Raises BlockingIOError if the underlying raw stream has no
561 data at the moment.
562 """
563 self._unsupported("read")
564
565 def readinto(self, b: bytes) -> int:
566 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
567
568 Like read(), this may issue multiple reads to the underlying
569 raw stream, unless the latter is 'interactive' (XXX or a
570 pipe?).
571
572 Returns the number of bytes read (0 for EOF).
573
574 Raises BlockingIOError if the underlying raw stream has no
575 data at the moment.
576 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000577 # XXX This ought to work with anything that supports the buffer API
Guido van Rossum87429772007-04-10 21:06:59 +0000578 data = self.read(len(b))
579 n = len(data)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000580 try:
581 b[:n] = data
582 except TypeError as err:
583 import array
584 if not isinstance(b, array.array):
585 raise err
586 b[:n] = array.array('b', data)
Guido van Rossum87429772007-04-10 21:06:59 +0000587 return n
Guido van Rossum141f7672007-04-10 00:22:16 +0000588
589 def write(self, b: bytes) -> int:
590 """write(b: bytes) -> int. Write the given buffer to the IO stream.
591
592 Returns the number of bytes written, which is never less than
593 len(b).
594
595 Raises BlockingIOError if the buffer is full and the
596 underlying raw stream cannot accept more data at the moment.
597 """
598 self._unsupported("write")
599
600
601class _BufferedIOMixin(BufferedIOBase):
602
603 """A mixin implementation of BufferedIOBase with an underlying raw stream.
604
605 This passes most requests on to the underlying raw stream. It
606 does *not* provide implementations of read(), readinto() or
607 write().
608 """
609
610 def __init__(self, raw):
611 self.raw = raw
612
613 ### Positioning ###
614
615 def seek(self, pos, whence=0):
Guido van Rossum53807da2007-04-10 19:01:47 +0000616 return self.raw.seek(pos, whence)
Guido van Rossum141f7672007-04-10 00:22:16 +0000617
618 def tell(self):
619 return self.raw.tell()
620
621 def truncate(self, pos=None):
Guido van Rossum79b79ee2007-10-25 23:21:03 +0000622 # Flush the stream. We're mixing buffered I/O with lower-level I/O,
623 # and a flush may be necessary to synch both views of the current
624 # file state.
625 self.flush()
Guido van Rossum57233cb2007-10-26 17:19:33 +0000626
627 if pos is None:
628 pos = self.tell()
629 return self.raw.truncate(pos)
Guido van Rossum141f7672007-04-10 00:22:16 +0000630
631 ### Flush and close ###
632
633 def flush(self):
634 self.raw.flush()
635
636 def close(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000637 if not self.closed:
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000638 try:
639 self.flush()
640 except IOError:
641 pass # If flush() fails, just give up
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000642 self.raw.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000643
644 ### Inquiries ###
645
646 def seekable(self):
647 return self.raw.seekable()
648
649 def readable(self):
650 return self.raw.readable()
651
652 def writable(self):
653 return self.raw.writable()
654
655 @property
656 def closed(self):
657 return self.raw.closed
658
659 ### Lower-level APIs ###
660
661 def fileno(self):
662 return self.raw.fileno()
663
664 def isatty(self):
665 return self.raw.isatty()
666
667
Guido van Rossum024da5c2007-05-17 23:59:11 +0000668class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000669
Guido van Rossum024da5c2007-05-17 23:59:11 +0000670 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000671
Guido van Rossum024da5c2007-05-17 23:59:11 +0000672 # XXX More docs
673
674 def __init__(self, initial_bytes=None):
Guido van Rossum254348e2007-11-21 19:29:53 +0000675 buf = bytearray()
Guido van Rossum024da5c2007-05-17 23:59:11 +0000676 if initial_bytes is not None:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000677 buf += initial_bytes
678 self._buffer = buf
Guido van Rossum28524c72007-02-27 05:47:44 +0000679 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000680
681 def getvalue(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000682 return bytes(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000683
Guido van Rossum024da5c2007-05-17 23:59:11 +0000684 def read(self, n=None):
685 if n is None:
686 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000687 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000688 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000689 newpos = min(len(self._buffer), self._pos + n)
690 b = self._buffer[self._pos : newpos]
691 self._pos = newpos
Guido van Rossum98297ee2007-11-06 21:34:58 +0000692 return bytes(b)
Guido van Rossum28524c72007-02-27 05:47:44 +0000693
Guido van Rossum024da5c2007-05-17 23:59:11 +0000694 def read1(self, n):
695 return self.read(n)
696
Guido van Rossum28524c72007-02-27 05:47:44 +0000697 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000698 if self.closed:
699 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000700 if isinstance(b, str):
701 raise TypeError("can't write str to binary stream")
Guido van Rossum28524c72007-02-27 05:47:44 +0000702 n = len(b)
703 newpos = self._pos + n
Guido van Rossumb972a782007-07-21 00:25:15 +0000704 if newpos > len(self._buffer):
705 # Inserts null bytes between the current end of the file
706 # and the new write position.
Guido van Rossuma74184e2007-08-29 04:05:57 +0000707 padding = b'\x00' * (newpos - len(self._buffer) - n)
Guido van Rossumb972a782007-07-21 00:25:15 +0000708 self._buffer[self._pos:newpos - n] = padding
Guido van Rossum28524c72007-02-27 05:47:44 +0000709 self._buffer[self._pos:newpos] = b
710 self._pos = newpos
711 return n
712
713 def seek(self, pos, whence=0):
Christian Heimes3ab4f652007-11-09 01:27:29 +0000714 try:
715 pos = pos.__index__()
716 except AttributeError as err:
717 raise TypeError("an integer is required") from err
Guido van Rossum28524c72007-02-27 05:47:44 +0000718 if whence == 0:
719 self._pos = max(0, pos)
720 elif whence == 1:
721 self._pos = max(0, self._pos + pos)
722 elif whence == 2:
723 self._pos = max(0, len(self._buffer) + pos)
724 else:
725 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000726 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000727
728 def tell(self):
729 return self._pos
730
731 def truncate(self, pos=None):
732 if pos is None:
733 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000734 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000735 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000736
737 def readable(self):
738 return True
739
740 def writable(self):
741 return True
742
743 def seekable(self):
744 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000745
746
Guido van Rossum141f7672007-04-10 00:22:16 +0000747class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000748
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000749 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000750
Guido van Rossum78892e42007-04-06 17:31:18 +0000751 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000752 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000753 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000754 raw._checkReadable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000755 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000756 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000757 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000758
Guido van Rossum024da5c2007-05-17 23:59:11 +0000759 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000760 """Read n bytes.
761
762 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000763 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000764 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000765 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000766 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000767 if n is None:
768 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000769 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000770 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000771 to_read = max(self.buffer_size,
772 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000773 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000774 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000775 nodata_val = current
776 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000777 self._read_buf += current
778 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000779 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000780 n = len(self._read_buf)
781 out = self._read_buf[:n]
782 self._read_buf = self._read_buf[n:]
783 else:
784 out = nodata_val
785 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000786
Guido van Rossum13633bb2007-04-13 18:42:35 +0000787 def peek(self, n=0, *, unsafe=False):
788 """Returns buffered bytes without advancing the position.
789
790 The argument indicates a desired minimal number of bytes; we
791 do at most one raw read to satisfy it. We never return more
792 than self.buffer_size.
793
794 Unless unsafe=True is passed, we return a copy.
795 """
796 want = min(n, self.buffer_size)
797 have = len(self._read_buf)
798 if have < want:
799 to_read = self.buffer_size - have
800 current = self.raw.read(to_read)
801 if current:
802 self._read_buf += current
803 result = self._read_buf
804 if unsafe:
805 result = result[:]
806 return result
807
808 def read1(self, n):
809 """Reads up to n bytes.
810
811 Returns up to n bytes. If at least one byte is buffered,
812 we only return buffered bytes. Otherwise, we do one
813 raw read.
814 """
815 if n <= 0:
816 return b""
817 self.peek(1, unsafe=True)
818 return self.read(min(n, len(self._read_buf)))
819
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000820 def tell(self):
821 return self.raw.tell() - len(self._read_buf)
822
823 def seek(self, pos, whence=0):
824 if whence == 1:
825 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000826 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000827 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000828 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000829
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000830
Guido van Rossum141f7672007-04-10 00:22:16 +0000831class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000832
Guido van Rossum78892e42007-04-06 17:31:18 +0000833 # XXX docstring
834
Guido van Rossum141f7672007-04-10 00:22:16 +0000835 def __init__(self, raw,
836 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000837 raw._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000838 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000839 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000840 self.max_buffer_size = (2*buffer_size
841 if max_buffer_size is None
842 else max_buffer_size)
Guido van Rossum254348e2007-11-21 19:29:53 +0000843 self._write_buf = bytearray()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000844
845 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000846 if self.closed:
847 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000848 if isinstance(b, str):
849 raise TypeError("can't write str to binary stream")
Guido van Rossum01a27522007-03-07 01:00:12 +0000850 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000851 if len(self._write_buf) > self.buffer_size:
852 # We're full, so let's pre-flush the buffer
853 try:
854 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000855 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000856 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000857 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000858 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000859 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000860 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000861 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000862 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000863 try:
864 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000865 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000866 if (len(self._write_buf) > self.max_buffer_size):
867 # We've hit max_buffer_size. We have to accept a partial
868 # write and cut back our buffer.
869 overage = len(self._write_buf) - self.max_buffer_size
870 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000871 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000872 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000873
874 def flush(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000875 if self.closed:
876 raise ValueError("flush of closed file")
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000877 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000878 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000879 while self._write_buf:
880 n = self.raw.write(self._write_buf)
881 del self._write_buf[:n]
882 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000883 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000884 n = e.characters_written
885 del self._write_buf[:n]
886 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000887 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000888
889 def tell(self):
890 return self.raw.tell() + len(self._write_buf)
891
892 def seek(self, pos, whence=0):
893 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000894 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000895
Guido van Rossum01a27522007-03-07 01:00:12 +0000896
Guido van Rossum141f7672007-04-10 00:22:16 +0000897class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000898
Guido van Rossum01a27522007-03-07 01:00:12 +0000899 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000900
Guido van Rossum141f7672007-04-10 00:22:16 +0000901 A buffered reader object and buffered writer object put together
902 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000903
904 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000905
906 XXX The usefulness of this (compared to having two separate IO
907 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000908 """
909
Guido van Rossum141f7672007-04-10 00:22:16 +0000910 def __init__(self, reader, writer,
911 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
912 """Constructor.
913
914 The arguments are two RawIO instances.
915 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000916 reader._checkReadable()
917 writer._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000918 self.reader = BufferedReader(reader, buffer_size)
919 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000920
Guido van Rossum024da5c2007-05-17 23:59:11 +0000921 def read(self, n=None):
922 if n is None:
923 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000924 return self.reader.read(n)
925
Guido van Rossum141f7672007-04-10 00:22:16 +0000926 def readinto(self, b):
927 return self.reader.readinto(b)
928
Guido van Rossum01a27522007-03-07 01:00:12 +0000929 def write(self, b):
930 return self.writer.write(b)
931
Guido van Rossum13633bb2007-04-13 18:42:35 +0000932 def peek(self, n=0, *, unsafe=False):
933 return self.reader.peek(n, unsafe=unsafe)
934
935 def read1(self, n):
936 return self.reader.read1(n)
937
Guido van Rossum01a27522007-03-07 01:00:12 +0000938 def readable(self):
939 return self.reader.readable()
940
941 def writable(self):
942 return self.writer.writable()
943
944 def flush(self):
945 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000946
Guido van Rossum01a27522007-03-07 01:00:12 +0000947 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000948 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000949 self.reader.close()
950
951 def isatty(self):
952 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000953
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000954 @property
955 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000956 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000957
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000958
Guido van Rossum141f7672007-04-10 00:22:16 +0000959class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000960
Guido van Rossum78892e42007-04-06 17:31:18 +0000961 # XXX docstring
962
Guido van Rossum141f7672007-04-10 00:22:16 +0000963 def __init__(self, raw,
964 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000965 raw._checkSeekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000966 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000967 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
968
Guido van Rossum01a27522007-03-07 01:00:12 +0000969 def seek(self, pos, whence=0):
970 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000971 # First do the raw seek, then empty the read buffer, so that
972 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000973 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000974 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000975 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000976
977 def tell(self):
978 if (self._write_buf):
979 return self.raw.tell() + len(self._write_buf)
980 else:
981 return self.raw.tell() - len(self._read_buf)
982
Guido van Rossum024da5c2007-05-17 23:59:11 +0000983 def read(self, n=None):
984 if n is None:
985 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000986 self.flush()
987 return BufferedReader.read(self, n)
988
Guido van Rossum141f7672007-04-10 00:22:16 +0000989 def readinto(self, b):
990 self.flush()
991 return BufferedReader.readinto(self, b)
992
Guido van Rossum13633bb2007-04-13 18:42:35 +0000993 def peek(self, n=0, *, unsafe=False):
994 self.flush()
995 return BufferedReader.peek(self, n, unsafe=unsafe)
996
997 def read1(self, n):
998 self.flush()
999 return BufferedReader.read1(self, n)
1000
Guido van Rossum01a27522007-03-07 01:00:12 +00001001 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +00001002 if self._read_buf:
1003 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
1004 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +00001005 return BufferedWriter.write(self, b)
1006
Guido van Rossum78892e42007-04-06 17:31:18 +00001007
Guido van Rossumcce92b22007-04-10 14:41:39 +00001008class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +00001009
1010 """Base class for text I/O.
1011
1012 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +00001013
1014 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +00001015 """
1016
1017 def read(self, n: int = -1) -> str:
1018 """read(n: int = -1) -> str. Read at most n characters from stream.
1019
1020 Read from underlying buffer until we have n characters or we hit EOF.
1021 If n is negative or omitted, read until EOF.
1022 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001023 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +00001024
Guido van Rossum9b76da62007-04-11 01:09:03 +00001025 def write(self, s: str) -> int:
1026 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001027 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +00001028
Guido van Rossum9b76da62007-04-11 01:09:03 +00001029 def truncate(self, pos: int = None) -> int:
1030 """truncate(pos: int = None) -> int. Truncate size to pos."""
1031 self.flush()
1032 if pos is None:
1033 pos = self.tell()
1034 self.seek(pos)
1035 return self.buffer.truncate()
1036
Guido van Rossum78892e42007-04-06 17:31:18 +00001037 def readline(self) -> str:
1038 """readline() -> str. Read until newline or EOF.
1039
1040 Returns an empty string if EOF is hit immediately.
1041 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001042 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +00001043
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001044 @property
1045 def encoding(self):
1046 """Subclasses should override."""
1047 return None
1048
Guido van Rossum8358db22007-08-18 21:39:55 +00001049 @property
1050 def newlines(self):
1051 """newlines -> None | str | tuple of str. Line endings translated
1052 so far.
1053
1054 Only line endings translated during reading are considered.
1055
1056 Subclasses should override.
1057 """
1058 return None
1059
Guido van Rossum78892e42007-04-06 17:31:18 +00001060
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001061class IncrementalNewlineDecoder(codecs.IncrementalDecoder):
1062 """Codec used when reading a file in universal newlines mode.
1063 It wraps another incremental decoder, translating \\r\\n and \\r into \\n.
1064 It also records the types of newlines encountered.
1065 When used with translate=False, it ensures that the newline sequence is
1066 returned in one piece.
1067 """
1068 def __init__(self, decoder, translate, errors='strict'):
1069 codecs.IncrementalDecoder.__init__(self, errors=errors)
1070 self.buffer = b''
1071 self.translate = translate
1072 self.decoder = decoder
1073 self.seennl = 0
1074
1075 def decode(self, input, final=False):
1076 # decode input (with the eventual \r from a previous pass)
1077 if self.buffer:
1078 input = self.buffer + input
1079
1080 output = self.decoder.decode(input, final=final)
1081
1082 # retain last \r even when not translating data:
1083 # then readline() is sure to get \r\n in one pass
1084 if output.endswith("\r") and not final:
1085 output = output[:-1]
1086 self.buffer = b'\r'
1087 else:
1088 self.buffer = b''
1089
1090 # Record which newlines are read
1091 crlf = output.count('\r\n')
1092 cr = output.count('\r') - crlf
1093 lf = output.count('\n') - crlf
1094 self.seennl |= (lf and self._LF) | (cr and self._CR) \
1095 | (crlf and self._CRLF)
1096
1097 if self.translate:
1098 if crlf:
1099 output = output.replace("\r\n", "\n")
1100 if cr:
1101 output = output.replace("\r", "\n")
1102
1103 return output
1104
1105 def getstate(self):
1106 buf, flag = self.decoder.getstate()
1107 return buf + self.buffer, flag
1108
1109 def setstate(self, state):
1110 buf, flag = state
1111 if buf.endswith(b'\r'):
1112 self.buffer = b'\r'
1113 buf = buf[:-1]
1114 else:
1115 self.buffer = b''
1116 self.decoder.setstate((buf, flag))
1117
1118 def reset(self):
Alexandre Vassalottic3d7fe02007-12-28 01:24:22 +00001119 self.seennl = 0
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001120 self.buffer = b''
1121 self.decoder.reset()
1122
1123 _LF = 1
1124 _CR = 2
1125 _CRLF = 4
1126
1127 @property
1128 def newlines(self):
1129 return (None,
1130 "\n",
1131 "\r",
1132 ("\r", "\n"),
1133 "\r\n",
1134 ("\n", "\r\n"),
1135 ("\r", "\r\n"),
1136 ("\r", "\n", "\r\n")
1137 )[self.seennl]
1138
1139
Guido van Rossum78892e42007-04-06 17:31:18 +00001140class TextIOWrapper(TextIOBase):
1141
1142 """Buffered text stream.
1143
1144 Character and line based layer over a BufferedIOBase object.
1145 """
1146
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001147 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +00001148
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001149 def __init__(self, buffer, encoding=None, errors=None, newline=None,
1150 line_buffering=False):
Guido van Rossum8358db22007-08-18 21:39:55 +00001151 if newline not in (None, "", "\n", "\r", "\r\n"):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001152 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +00001153 if encoding is None:
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001154 try:
1155 encoding = os.device_encoding(buffer.fileno())
Brett Cannon041683d2007-10-11 23:08:53 +00001156 except (AttributeError, UnsupportedOperation):
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001157 pass
1158 if encoding is None:
Martin v. Löwisd78d3b42007-08-11 15:36:45 +00001159 try:
1160 import locale
1161 except ImportError:
1162 # Importing locale may fail if Python is being built
1163 encoding = "ascii"
1164 else:
1165 encoding = locale.getpreferredencoding()
Guido van Rossum78892e42007-04-06 17:31:18 +00001166
Christian Heimes8bd14fb2007-11-08 16:34:32 +00001167 if not isinstance(encoding, str):
1168 raise ValueError("invalid encoding: %r" % encoding)
1169
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001170 if errors is None:
1171 errors = "strict"
1172 else:
1173 if not isinstance(errors, str):
1174 raise ValueError("invalid errors: %r" % errors)
1175
Guido van Rossum78892e42007-04-06 17:31:18 +00001176 self.buffer = buffer
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001177 self._line_buffering = line_buffering
Guido van Rossum78892e42007-04-06 17:31:18 +00001178 self._encoding = encoding
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001179 self._errors = errors
Guido van Rossum8358db22007-08-18 21:39:55 +00001180 self._readuniversal = not newline
1181 self._readtranslate = newline is None
1182 self._readnl = newline
1183 self._writetranslate = newline != ''
1184 self._writenl = newline or os.linesep
Alexandre Vassalottia38f73b2008-01-07 18:30:48 +00001185 self._encoder = None
Guido van Rossum78892e42007-04-06 17:31:18 +00001186 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +00001187 self._pending = ""
1188 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001189 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001190
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001191 @property
1192 def encoding(self):
1193 return self._encoding
1194
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001195 @property
1196 def errors(self):
1197 return self._errors
1198
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001199 @property
1200 def line_buffering(self):
1201 return self._line_buffering
1202
Guido van Rossum9b76da62007-04-11 01:09:03 +00001203 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001204 # tuple (decoder_state, readahead, pending) where decoder_state is
1205 # the second (integer) item of the decoder state, readahead is the
1206 # chunk of bytes that was read, and pending is the characters that
1207 # were rendered by the decoder after feeding it those bytes. We
1208 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001209
1210 def _seekable(self):
1211 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001212
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001213 def flush(self):
1214 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001215 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001216
1217 def close(self):
Guido van Rossum33e7a8e2007-07-22 20:38:07 +00001218 try:
1219 self.flush()
1220 except:
1221 pass # If flush() fails, just give up
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001222 self.buffer.close()
1223
1224 @property
1225 def closed(self):
1226 return self.buffer.closed
1227
Guido van Rossum9be55972007-04-07 02:59:27 +00001228 def fileno(self):
1229 return self.buffer.fileno()
1230
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001231 def isatty(self):
1232 return self.buffer.isatty()
1233
Guido van Rossum78892e42007-04-06 17:31:18 +00001234 def write(self, s: str):
Guido van Rossum4b5386f2007-07-10 09:12:49 +00001235 if self.closed:
1236 raise ValueError("write to closed file")
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001237 if not isinstance(s, str):
Guido van Rossumdcce8392007-08-29 18:10:08 +00001238 raise TypeError("can't write %s to text stream" %
1239 s.__class__.__name__)
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001240 length = len(s)
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001241 haslf = (self._writetranslate or self._line_buffering) and "\n" in s
Guido van Rossum8358db22007-08-18 21:39:55 +00001242 if haslf and self._writetranslate and self._writenl != "\n":
1243 s = s.replace("\n", self._writenl)
Alexandre Vassalottia38f73b2008-01-07 18:30:48 +00001244 encoder = self._encoder or self._get_encoder()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001245 # XXX What if we were just reading?
Alexandre Vassalottia38f73b2008-01-07 18:30:48 +00001246 b = encoder.encode(s)
Guido van Rossum8358db22007-08-18 21:39:55 +00001247 self.buffer.write(b)
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001248 if self._line_buffering and (haslf or "\r" in s):
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001249 self.flush()
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001250 self._snapshot = None
1251 if self._decoder:
1252 self._decoder.reset()
1253 return length
Guido van Rossum78892e42007-04-06 17:31:18 +00001254
Alexandre Vassalottia38f73b2008-01-07 18:30:48 +00001255 def _get_encoder(self):
1256 make_encoder = codecs.getincrementalencoder(self._encoding)
1257 self._encoder = make_encoder(self._errors)
1258 return self._encoder
1259
Guido van Rossum78892e42007-04-06 17:31:18 +00001260 def _get_decoder(self):
1261 make_decoder = codecs.getincrementaldecoder(self._encoding)
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001262 decoder = make_decoder(self._errors)
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001263 if self._readuniversal:
1264 decoder = IncrementalNewlineDecoder(decoder, self._readtranslate)
1265 self._decoder = decoder
Guido van Rossum78892e42007-04-06 17:31:18 +00001266 return decoder
1267
Guido van Rossum9b76da62007-04-11 01:09:03 +00001268 def _read_chunk(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +00001269 if self._decoder is None:
1270 raise ValueError("no decoder")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001271 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001272 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001273 pending = self._decoder.decode(readahead, not readahead)
1274 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001275 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001276 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001277 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001278 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001279 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001280
1281 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001282 x = 0
1283 for i in bytes(ds):
1284 x = x<<8 | i
1285 return (x<<64) | pos
1286
1287 def _decode_decoder_state(self, pos):
1288 x, pos = divmod(pos, 1<<64)
1289 if not x:
1290 return None, pos
1291 b = b""
1292 while x:
1293 b.append(x&0xff)
1294 x >>= 8
1295 return str(b[::-1]), pos
1296
1297 def tell(self):
1298 if not self._seekable:
1299 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001300 if not self._telling:
1301 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001302 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001303 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001304 decoder = self._decoder
1305 if decoder is None or self._snapshot is None:
Guido van Rossum5abbf752007-08-27 17:39:33 +00001306 if self._pending:
1307 raise ValueError("pending data")
Guido van Rossumcba608c2007-04-11 14:19:59 +00001308 return position
1309 decoder_state, readahead, pending = self._snapshot
1310 position -= len(readahead)
1311 needed = len(pending) - len(self._pending)
1312 if not needed:
1313 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001314 saved_state = decoder.getstate()
1315 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001316 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001317 n = 0
Guido van Rossum254348e2007-11-21 19:29:53 +00001318 bb = bytearray(1)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001319 for i, bb[0] in enumerate(readahead):
1320 n += len(decoder.decode(bb))
1321 if n >= needed:
1322 decoder_buffer, decoder_state = decoder.getstate()
1323 return self._encode_decoder_state(
1324 decoder_state,
Amaury Forgeot d'Arca2d1d7e2007-11-19 21:14:47 +00001325 position + (i+1) - len(decoder_buffer) - (n - needed))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001326 raise IOError("Can't reconstruct logical file position")
1327 finally:
1328 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001329
1330 def seek(self, pos, whence=0):
1331 if not self._seekable:
1332 raise IOError("Underlying stream is not seekable")
1333 if whence == 1:
1334 if pos != 0:
1335 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001336 pos = self.tell()
1337 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001338 if whence == 2:
1339 if pos != 0:
1340 raise IOError("Can't do nonzero end-relative seeks")
1341 self.flush()
1342 pos = self.buffer.seek(0, 2)
1343 self._snapshot = None
1344 self._pending = ""
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001345 if self._decoder:
1346 self._decoder.reset()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001347 return pos
1348 if whence != 0:
1349 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1350 (whence,))
1351 if pos < 0:
1352 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001353 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001354 orig_pos = pos
1355 ds, pos = self._decode_decoder_state(pos)
1356 if not ds:
1357 self.buffer.seek(pos)
1358 self._snapshot = None
1359 self._pending = ""
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001360 if self._decoder:
1361 self._decoder.reset()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001362 return pos
Guido van Rossumd76e7792007-04-17 02:38:04 +00001363 decoder = self._decoder or self._get_decoder()
1364 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001365 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001366 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001367 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001368 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001369 return orig_pos
1370
Guido van Rossum024da5c2007-05-17 23:59:11 +00001371 def read(self, n=None):
1372 if n is None:
1373 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001374 decoder = self._decoder or self._get_decoder()
1375 res = self._pending
1376 if n < 0:
1377 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001378 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001379 self._snapshot = None
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001380 return res
Guido van Rossum78892e42007-04-06 17:31:18 +00001381 else:
1382 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001383 readahead, pending = self._read_chunk()
1384 res += pending
1385 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001386 break
1387 self._pending = res[n:]
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001388 return res[:n]
Guido van Rossum78892e42007-04-06 17:31:18 +00001389
Guido van Rossum024da5c2007-05-17 23:59:11 +00001390 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001391 self._telling = False
1392 line = self.readline()
1393 if not line:
1394 self._snapshot = None
1395 self._telling = self._seekable
1396 raise StopIteration
1397 return line
1398
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001399 def readline(self, limit=None):
Guido van Rossum98297ee2007-11-06 21:34:58 +00001400 if limit is None:
1401 limit = -1
1402 if limit >= 0:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001403 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001404 line = self.readline()
1405 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001406 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001407 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001408 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001409
Guido van Rossum78892e42007-04-06 17:31:18 +00001410 line = self._pending
1411 start = 0
1412 decoder = self._decoder or self._get_decoder()
1413
Guido van Rossum8358db22007-08-18 21:39:55 +00001414 pos = endpos = None
Guido van Rossum78892e42007-04-06 17:31:18 +00001415 while True:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001416 if self._readtranslate:
1417 # Newlines are already translated, only search for \n
1418 pos = line.find('\n', start)
1419 if pos >= 0:
1420 endpos = pos + 1
1421 break
1422 else:
1423 start = len(line)
1424
1425 elif self._readuniversal:
Guido van Rossum8358db22007-08-18 21:39:55 +00001426 # Universal newline search. Find any of \r, \r\n, \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001427 # The decoder ensures that \r\n are not split in two pieces
Guido van Rossum78892e42007-04-06 17:31:18 +00001428
Guido van Rossum8358db22007-08-18 21:39:55 +00001429 # In C we'd look for these in parallel of course.
1430 nlpos = line.find("\n", start)
1431 crpos = line.find("\r", start)
1432 if crpos == -1:
1433 if nlpos == -1:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001434 # Nothing found
Guido van Rossum8358db22007-08-18 21:39:55 +00001435 start = len(line)
Guido van Rossum78892e42007-04-06 17:31:18 +00001436 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001437 # Found \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001438 endpos = nlpos + 1
Guido van Rossum8358db22007-08-18 21:39:55 +00001439 break
1440 elif nlpos == -1:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001441 # Found lone \r
1442 endpos = crpos + 1
1443 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001444 elif nlpos < crpos:
1445 # Found \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001446 endpos = nlpos + 1
Guido van Rossum78892e42007-04-06 17:31:18 +00001447 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001448 elif nlpos == crpos + 1:
1449 # Found \r\n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001450 endpos = crpos + 2
Guido van Rossum8358db22007-08-18 21:39:55 +00001451 break
1452 else:
1453 # Found \r
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001454 endpos = crpos + 1
Guido van Rossum8358db22007-08-18 21:39:55 +00001455 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001456 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001457 # non-universal
1458 pos = line.find(self._readnl)
1459 if pos >= 0:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001460 endpos = pos + len(self._readnl)
Guido van Rossum8358db22007-08-18 21:39:55 +00001461 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001462
1463 # No line ending seen yet - get more data
Guido van Rossum8358db22007-08-18 21:39:55 +00001464 more_line = ''
Guido van Rossum78892e42007-04-06 17:31:18 +00001465 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001466 readahead, pending = self._read_chunk()
1467 more_line = pending
1468 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001469 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001470 if more_line:
1471 line += more_line
1472 else:
1473 # end of file
1474 self._pending = ''
1475 self._snapshot = None
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001476 return line
Guido van Rossum78892e42007-04-06 17:31:18 +00001477
Guido van Rossum8358db22007-08-18 21:39:55 +00001478 self._pending = line[endpos:]
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001479 return line[:endpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001480
Guido van Rossum8358db22007-08-18 21:39:55 +00001481 @property
1482 def newlines(self):
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001483 return self._decoder.newlines if self._decoder else None
Guido van Rossum024da5c2007-05-17 23:59:11 +00001484
1485class StringIO(TextIOWrapper):
1486
1487 # XXX This is really slow, but fully functional
1488
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001489 def __init__(self, initial_value="", encoding="utf-8",
1490 errors="strict", newline="\n"):
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001491 super(StringIO, self).__init__(BytesIO(),
1492 encoding=encoding,
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001493 errors=errors,
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001494 newline=newline)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001495 if initial_value:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001496 if not isinstance(initial_value, str):
Guido van Rossum34d19282007-08-09 01:03:29 +00001497 initial_value = str(initial_value)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001498 self.write(initial_value)
1499 self.seek(0)
1500
1501 def getvalue(self):
Guido van Rossum34d19282007-08-09 01:03:29 +00001502 self.flush()
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001503 return self.buffer.getvalue().decode(self._encoding, self._errors)