blob: 5066c49af303d4a500dc200f5d511bee56685cbe [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
192
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000193class OpenWrapper:
Georg Brandl1a3284e2007-12-02 09:40:06 +0000194 """Wrapper for builtins.open
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000195
196 Trick so that open won't become a bound method when stored
197 as a class variable (as dumbdbm does).
198
199 See initstdio() in Python/pythonrun.c.
200 """
201 def __new__(cls, *args, **kwargs):
202 return open(*args, **kwargs)
203
204
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000205class UnsupportedOperation(ValueError, IOError):
206 pass
207
208
Guido van Rossumb7f136e2007-08-22 18:14:10 +0000209class IOBase(metaclass=abc.ABCMeta):
Guido van Rossum28524c72007-02-27 05:47:44 +0000210
Guido van Rossum141f7672007-04-10 00:22:16 +0000211 """Base class for all I/O classes.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000212
Guido van Rossum141f7672007-04-10 00:22:16 +0000213 This class provides dummy implementations for many methods that
Guido van Rossum17e43e52007-02-27 15:45:13 +0000214 derived classes can override selectively; the default
215 implementations represent a file that cannot be read, written or
216 seeked.
217
Guido van Rossum141f7672007-04-10 00:22:16 +0000218 This does not define read(), readinto() and write(), nor
219 readline() and friends, since their signatures vary per layer.
Guido van Rossum53807da2007-04-10 19:01:47 +0000220
221 Not that calling any method (even inquiries) on a closed file is
222 undefined. Implementations may raise IOError in this case.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000223 """
224
Guido van Rossum141f7672007-04-10 00:22:16 +0000225 ### Internal ###
226
227 def _unsupported(self, name: str) -> IOError:
228 """Internal: raise an exception for unsupported operations."""
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000229 raise UnsupportedOperation("%s.%s() not supported" %
230 (self.__class__.__name__, name))
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000231
Guido van Rossum141f7672007-04-10 00:22:16 +0000232 ### Positioning ###
233
Guido van Rossum53807da2007-04-10 19:01:47 +0000234 def seek(self, pos: int, whence: int = 0) -> int:
235 """seek(pos: int, whence: int = 0) -> int. Change stream position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000236
237 Seek to byte offset pos relative to position indicated by whence:
238 0 Start of stream (the default). pos should be >= 0;
239 1 Current position - whence may be negative;
240 2 End of stream - whence usually negative.
Guido van Rossum53807da2007-04-10 19:01:47 +0000241 Returns the new absolute position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000242 """
243 self._unsupported("seek")
244
245 def tell(self) -> int:
246 """tell() -> int. Return current stream position."""
Guido van Rossum53807da2007-04-10 19:01:47 +0000247 return self.seek(0, 1)
Guido van Rossum141f7672007-04-10 00:22:16 +0000248
Guido van Rossum87429772007-04-10 21:06:59 +0000249 def truncate(self, pos: int = None) -> int:
250 """truncate(size: int = None) -> int. Truncate file to size bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000251
252 Size defaults to the current IO position as reported by tell().
Guido van Rossum87429772007-04-10 21:06:59 +0000253 Returns the new size.
Guido van Rossum141f7672007-04-10 00:22:16 +0000254 """
255 self._unsupported("truncate")
256
257 ### Flush and close ###
258
259 def flush(self) -> None:
260 """flush() -> None. Flushes write buffers, if applicable.
261
262 This is a no-op for read-only and non-blocking streams.
263 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000264 # XXX Should this return the number of bytes written???
Guido van Rossum141f7672007-04-10 00:22:16 +0000265
266 __closed = False
267
268 def close(self) -> None:
269 """close() -> None. Flushes and closes the IO object.
270
271 This must be idempotent. It should also set a flag for the
272 'closed' property (see below) to test.
273 """
274 if not self.__closed:
Guido van Rossum469734b2007-07-10 12:00:45 +0000275 try:
276 self.flush()
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000277 except IOError:
278 pass # If flush() fails, just give up
279 self.__closed = True
Guido van Rossum141f7672007-04-10 00:22:16 +0000280
281 def __del__(self) -> None:
282 """Destructor. Calls close()."""
283 # The try/except block is in case this is called at program
284 # exit time, when it's possible that globals have already been
285 # deleted, and then the close() call might fail. Since
286 # there's nothing we can do about such failures and they annoy
287 # the end users, we suppress the traceback.
288 try:
289 self.close()
290 except:
291 pass
292
293 ### Inquiries ###
294
295 def seekable(self) -> bool:
296 """seekable() -> bool. Return whether object supports random access.
297
298 If False, seek(), tell() and truncate() will raise IOError.
299 This method may need to do a test seek().
300 """
301 return False
302
Guido van Rossum5abbf752007-08-27 17:39:33 +0000303 def _checkSeekable(self, msg=None):
304 """Internal: raise an IOError if file is not seekable
305 """
306 if not self.seekable():
307 raise IOError("File or stream is not seekable."
308 if msg is None else msg)
309
310
Guido van Rossum141f7672007-04-10 00:22:16 +0000311 def readable(self) -> bool:
312 """readable() -> bool. Return whether object was opened for reading.
313
314 If False, read() will raise IOError.
315 """
316 return False
317
Guido van Rossum5abbf752007-08-27 17:39:33 +0000318 def _checkReadable(self, msg=None):
319 """Internal: raise an IOError if file is not readable
320 """
321 if not self.readable():
322 raise IOError("File or stream is not readable."
323 if msg is None else msg)
324
Guido van Rossum141f7672007-04-10 00:22:16 +0000325 def writable(self) -> bool:
326 """writable() -> bool. Return whether object was opened for writing.
327
328 If False, write() and truncate() will raise IOError.
329 """
330 return False
331
Guido van Rossum5abbf752007-08-27 17:39:33 +0000332 def _checkWritable(self, msg=None):
333 """Internal: raise an IOError if file is not writable
334 """
335 if not self.writable():
336 raise IOError("File or stream is not writable."
337 if msg is None else msg)
338
Guido van Rossum141f7672007-04-10 00:22:16 +0000339 @property
340 def closed(self):
341 """closed: bool. True iff the file has been closed.
342
343 For backwards compatibility, this is a property, not a predicate.
344 """
345 return self.__closed
346
Guido van Rossum5abbf752007-08-27 17:39:33 +0000347 def _checkClosed(self, msg=None):
348 """Internal: raise an ValueError if file is closed
349 """
350 if self.closed:
351 raise ValueError("I/O operation on closed file."
352 if msg is None else msg)
353
Guido van Rossum141f7672007-04-10 00:22:16 +0000354 ### Context manager ###
355
356 def __enter__(self) -> "IOBase": # That's a forward reference
357 """Context management protocol. Returns self."""
358 return self
359
360 def __exit__(self, *args) -> None:
361 """Context management protocol. Calls close()"""
362 self.close()
363
364 ### Lower-level APIs ###
365
366 # XXX Should these be present even if unimplemented?
367
368 def fileno(self) -> int:
369 """fileno() -> int. Returns underlying file descriptor if one exists.
370
371 Raises IOError if the IO object does not use a file descriptor.
372 """
373 self._unsupported("fileno")
374
375 def isatty(self) -> bool:
376 """isatty() -> int. Returns whether this is an 'interactive' stream.
377
378 Returns False if we don't know.
379 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000380 self._checkClosed()
Guido van Rossum141f7672007-04-10 00:22:16 +0000381 return False
382
Guido van Rossum7165cb12007-07-10 06:54:34 +0000383 ### Readline[s] and writelines ###
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000384
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000385 def readline(self, limit: int = -1) -> bytes:
386 """For backwards compatibility, a (slowish) readline()."""
Guido van Rossum2bf71382007-06-08 00:07:57 +0000387 if hasattr(self, "peek"):
388 def nreadahead():
389 readahead = self.peek(1, unsafe=True)
390 if not readahead:
391 return 1
392 n = (readahead.find(b"\n") + 1) or len(readahead)
393 if limit >= 0:
394 n = min(n, limit)
395 return n
396 else:
397 def nreadahead():
398 return 1
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000399 if limit is None:
400 limit = -1
Guido van Rossum254348e2007-11-21 19:29:53 +0000401 res = bytearray()
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000402 while limit < 0 or len(res) < limit:
Guido van Rossum2bf71382007-06-08 00:07:57 +0000403 b = self.read(nreadahead())
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000404 if not b:
405 break
406 res += b
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000407 if res.endswith(b"\n"):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000408 break
Guido van Rossum98297ee2007-11-06 21:34:58 +0000409 return bytes(res)
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000410
Guido van Rossum7165cb12007-07-10 06:54:34 +0000411 def __iter__(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000412 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000413 return self
414
415 def __next__(self):
416 line = self.readline()
417 if not line:
418 raise StopIteration
419 return line
420
421 def readlines(self, hint=None):
422 if hint is None:
423 return list(self)
424 n = 0
425 lines = []
426 for line in self:
427 lines.append(line)
428 n += len(line)
429 if n >= hint:
430 break
431 return lines
432
433 def writelines(self, lines):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000434 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000435 for line in lines:
436 self.write(line)
437
Guido van Rossum141f7672007-04-10 00:22:16 +0000438
439class RawIOBase(IOBase):
440
441 """Base class for raw binary I/O.
442
443 The read() method is implemented by calling readinto(); derived
444 classes that want to support read() only need to implement
445 readinto() as a primitive operation. In general, readinto()
446 can be more efficient than read().
447
448 (It would be tempting to also provide an implementation of
449 readinto() in terms of read(), in case the latter is a more
450 suitable primitive operation, but that would lead to nasty
451 recursion in case a subclass doesn't implement either.)
452 """
453
Guido van Rossum7165cb12007-07-10 06:54:34 +0000454 def read(self, n: int = -1) -> bytes:
Guido van Rossum78892e42007-04-06 17:31:18 +0000455 """read(n: int) -> bytes. Read and return up to n bytes.
Guido van Rossum01a27522007-03-07 01:00:12 +0000456
457 Returns an empty bytes array on EOF, or None if the object is
458 set not to block and has no data to read.
459 """
Guido van Rossum7165cb12007-07-10 06:54:34 +0000460 if n is None:
461 n = -1
462 if n < 0:
463 return self.readall()
Guido van Rossum254348e2007-11-21 19:29:53 +0000464 b = bytearray(n.__index__())
Guido van Rossum00efead2007-03-07 05:23:25 +0000465 n = self.readinto(b)
466 del b[n:]
Guido van Rossum98297ee2007-11-06 21:34:58 +0000467 return bytes(b)
Guido van Rossum28524c72007-02-27 05:47:44 +0000468
Guido van Rossum7165cb12007-07-10 06:54:34 +0000469 def readall(self):
470 """readall() -> bytes. Read until EOF, using multiple read() call."""
Guido van Rossum254348e2007-11-21 19:29:53 +0000471 res = bytearray()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000472 while True:
473 data = self.read(DEFAULT_BUFFER_SIZE)
474 if not data:
475 break
476 res += data
Guido van Rossum98297ee2007-11-06 21:34:58 +0000477 return bytes(res)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000478
Guido van Rossum141f7672007-04-10 00:22:16 +0000479 def readinto(self, b: bytes) -> int:
480 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
Guido van Rossum78892e42007-04-06 17:31:18 +0000481
482 Returns number of bytes read (0 for EOF), or None if the object
483 is set not to block as has no data to read.
484 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000485 self._unsupported("readinto")
Guido van Rossum28524c72007-02-27 05:47:44 +0000486
Guido van Rossum141f7672007-04-10 00:22:16 +0000487 def write(self, b: bytes) -> int:
Guido van Rossum78892e42007-04-06 17:31:18 +0000488 """write(b: bytes) -> int. Write the given buffer to the IO stream.
Guido van Rossum01a27522007-03-07 01:00:12 +0000489
Guido van Rossum78892e42007-04-06 17:31:18 +0000490 Returns the number of bytes written, which may be less than len(b).
Guido van Rossum01a27522007-03-07 01:00:12 +0000491 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000492 self._unsupported("write")
Guido van Rossum28524c72007-02-27 05:47:44 +0000493
Guido van Rossum78892e42007-04-06 17:31:18 +0000494
Guido van Rossum141f7672007-04-10 00:22:16 +0000495class FileIO(_fileio._FileIO, RawIOBase):
Guido van Rossum28524c72007-02-27 05:47:44 +0000496
Guido van Rossum141f7672007-04-10 00:22:16 +0000497 """Raw I/O implementation for OS files.
Guido van Rossum28524c72007-02-27 05:47:44 +0000498
Guido van Rossum141f7672007-04-10 00:22:16 +0000499 This multiply inherits from _FileIO and RawIOBase to make
500 isinstance(io.FileIO(), io.RawIOBase) return True without
501 requiring that _fileio._FileIO inherits from io.RawIOBase (which
502 would be hard to do since _fileio.c is written in C).
503 """
Guido van Rossuma9e20242007-03-08 00:43:48 +0000504
Guido van Rossum87429772007-04-10 21:06:59 +0000505 def close(self):
506 _fileio._FileIO.close(self)
507 RawIOBase.close(self)
508
Guido van Rossum13633bb2007-04-13 18:42:35 +0000509 @property
510 def name(self):
511 return self._name
512
513 @property
514 def mode(self):
515 return self._mode
516
Guido van Rossuma9e20242007-03-08 00:43:48 +0000517
Guido van Rossumcce92b22007-04-10 14:41:39 +0000518class BufferedIOBase(IOBase):
Guido van Rossum141f7672007-04-10 00:22:16 +0000519
520 """Base class for buffered IO objects.
521
522 The main difference with RawIOBase is that the read() method
523 supports omitting the size argument, and does not have a default
524 implementation that defers to readinto().
525
526 In addition, read(), readinto() and write() may raise
527 BlockingIOError if the underlying raw stream is in non-blocking
528 mode and not ready; unlike their raw counterparts, they will never
529 return None.
530
531 A typical implementation should not inherit from a RawIOBase
532 implementation, but wrap one.
533 """
534
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000535 def read(self, n: int = None) -> bytes:
536 """read(n: int = None) -> bytes. Read and return up to n bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000537
Guido van Rossum024da5c2007-05-17 23:59:11 +0000538 If the argument is omitted, None, or negative, reads and
539 returns all data until EOF.
Guido van Rossum141f7672007-04-10 00:22:16 +0000540
541 If the argument is positive, and the underlying raw stream is
542 not 'interactive', multiple raw reads may be issued to satisfy
543 the byte count (unless EOF is reached first). But for
544 interactive raw streams (XXX and for pipes?), at most one raw
545 read will be issued, and a short result does not imply that
546 EOF is imminent.
547
548 Returns an empty bytes array on EOF.
549
550 Raises BlockingIOError if the underlying raw stream has no
551 data at the moment.
552 """
553 self._unsupported("read")
554
555 def readinto(self, b: bytes) -> int:
556 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
557
558 Like read(), this may issue multiple reads to the underlying
559 raw stream, unless the latter is 'interactive' (XXX or a
560 pipe?).
561
562 Returns the number of bytes read (0 for EOF).
563
564 Raises BlockingIOError if the underlying raw stream has no
565 data at the moment.
566 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000567 # XXX This ought to work with anything that supports the buffer API
Guido van Rossum87429772007-04-10 21:06:59 +0000568 data = self.read(len(b))
569 n = len(data)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000570 try:
571 b[:n] = data
572 except TypeError as err:
573 import array
574 if not isinstance(b, array.array):
575 raise err
576 b[:n] = array.array('b', data)
Guido van Rossum87429772007-04-10 21:06:59 +0000577 return n
Guido van Rossum141f7672007-04-10 00:22:16 +0000578
579 def write(self, b: bytes) -> int:
580 """write(b: bytes) -> int. Write the given buffer to the IO stream.
581
582 Returns the number of bytes written, which is never less than
583 len(b).
584
585 Raises BlockingIOError if the buffer is full and the
586 underlying raw stream cannot accept more data at the moment.
587 """
588 self._unsupported("write")
589
590
591class _BufferedIOMixin(BufferedIOBase):
592
593 """A mixin implementation of BufferedIOBase with an underlying raw stream.
594
595 This passes most requests on to the underlying raw stream. It
596 does *not* provide implementations of read(), readinto() or
597 write().
598 """
599
600 def __init__(self, raw):
601 self.raw = raw
602
603 ### Positioning ###
604
605 def seek(self, pos, whence=0):
Guido van Rossum53807da2007-04-10 19:01:47 +0000606 return self.raw.seek(pos, whence)
Guido van Rossum141f7672007-04-10 00:22:16 +0000607
608 def tell(self):
609 return self.raw.tell()
610
611 def truncate(self, pos=None):
Guido van Rossum79b79ee2007-10-25 23:21:03 +0000612 # Flush the stream. We're mixing buffered I/O with lower-level I/O,
613 # and a flush may be necessary to synch both views of the current
614 # file state.
615 self.flush()
Guido van Rossum57233cb2007-10-26 17:19:33 +0000616
617 if pos is None:
618 pos = self.tell()
619 return self.raw.truncate(pos)
Guido van Rossum141f7672007-04-10 00:22:16 +0000620
621 ### Flush and close ###
622
623 def flush(self):
624 self.raw.flush()
625
626 def close(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000627 if not self.closed:
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000628 try:
629 self.flush()
630 except IOError:
631 pass # If flush() fails, just give up
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000632 self.raw.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000633
634 ### Inquiries ###
635
636 def seekable(self):
637 return self.raw.seekable()
638
639 def readable(self):
640 return self.raw.readable()
641
642 def writable(self):
643 return self.raw.writable()
644
645 @property
646 def closed(self):
647 return self.raw.closed
648
649 ### Lower-level APIs ###
650
651 def fileno(self):
652 return self.raw.fileno()
653
654 def isatty(self):
655 return self.raw.isatty()
656
657
Guido van Rossum024da5c2007-05-17 23:59:11 +0000658class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000659
Guido van Rossum024da5c2007-05-17 23:59:11 +0000660 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000661
Guido van Rossum024da5c2007-05-17 23:59:11 +0000662 # XXX More docs
663
664 def __init__(self, initial_bytes=None):
Guido van Rossum254348e2007-11-21 19:29:53 +0000665 buf = bytearray()
Guido van Rossum024da5c2007-05-17 23:59:11 +0000666 if initial_bytes is not None:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000667 buf += initial_bytes
668 self._buffer = buf
Guido van Rossum28524c72007-02-27 05:47:44 +0000669 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000670
671 def getvalue(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000672 return bytes(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000673
Guido van Rossum024da5c2007-05-17 23:59:11 +0000674 def read(self, n=None):
675 if n is None:
676 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000677 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000678 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000679 newpos = min(len(self._buffer), self._pos + n)
680 b = self._buffer[self._pos : newpos]
681 self._pos = newpos
Guido van Rossum98297ee2007-11-06 21:34:58 +0000682 return bytes(b)
Guido van Rossum28524c72007-02-27 05:47:44 +0000683
Guido van Rossum024da5c2007-05-17 23:59:11 +0000684 def read1(self, n):
685 return self.read(n)
686
Guido van Rossum28524c72007-02-27 05:47:44 +0000687 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000688 if self.closed:
689 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000690 if isinstance(b, str):
691 raise TypeError("can't write str to binary stream")
Guido van Rossum28524c72007-02-27 05:47:44 +0000692 n = len(b)
693 newpos = self._pos + n
Guido van Rossumb972a782007-07-21 00:25:15 +0000694 if newpos > len(self._buffer):
695 # Inserts null bytes between the current end of the file
696 # and the new write position.
Guido van Rossuma74184e2007-08-29 04:05:57 +0000697 padding = b'\x00' * (newpos - len(self._buffer) - n)
Guido van Rossumb972a782007-07-21 00:25:15 +0000698 self._buffer[self._pos:newpos - n] = padding
Guido van Rossum28524c72007-02-27 05:47:44 +0000699 self._buffer[self._pos:newpos] = b
700 self._pos = newpos
701 return n
702
703 def seek(self, pos, whence=0):
Christian Heimes3ab4f652007-11-09 01:27:29 +0000704 try:
705 pos = pos.__index__()
706 except AttributeError as err:
707 raise TypeError("an integer is required") from err
Guido van Rossum28524c72007-02-27 05:47:44 +0000708 if whence == 0:
709 self._pos = max(0, pos)
710 elif whence == 1:
711 self._pos = max(0, self._pos + pos)
712 elif whence == 2:
713 self._pos = max(0, len(self._buffer) + pos)
714 else:
715 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000716 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000717
718 def tell(self):
719 return self._pos
720
721 def truncate(self, pos=None):
722 if pos is None:
723 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000724 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000725 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000726
727 def readable(self):
728 return True
729
730 def writable(self):
731 return True
732
733 def seekable(self):
734 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000735
736
Guido van Rossum141f7672007-04-10 00:22:16 +0000737class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000738
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000739 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000740
Guido van Rossum78892e42007-04-06 17:31:18 +0000741 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000742 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000743 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000744 raw._checkReadable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000745 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000746 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000747 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000748
Guido van Rossum024da5c2007-05-17 23:59:11 +0000749 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000750 """Read n bytes.
751
752 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000753 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000754 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000755 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000756 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000757 if n is None:
758 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000759 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000760 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000761 to_read = max(self.buffer_size,
762 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000763 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000764 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000765 nodata_val = current
766 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000767 self._read_buf += current
768 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000769 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000770 n = len(self._read_buf)
771 out = self._read_buf[:n]
772 self._read_buf = self._read_buf[n:]
773 else:
774 out = nodata_val
775 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000776
Guido van Rossum13633bb2007-04-13 18:42:35 +0000777 def peek(self, n=0, *, unsafe=False):
778 """Returns buffered bytes without advancing the position.
779
780 The argument indicates a desired minimal number of bytes; we
781 do at most one raw read to satisfy it. We never return more
782 than self.buffer_size.
783
784 Unless unsafe=True is passed, we return a copy.
785 """
786 want = min(n, self.buffer_size)
787 have = len(self._read_buf)
788 if have < want:
789 to_read = self.buffer_size - have
790 current = self.raw.read(to_read)
791 if current:
792 self._read_buf += current
793 result = self._read_buf
794 if unsafe:
795 result = result[:]
796 return result
797
798 def read1(self, n):
799 """Reads up to n bytes.
800
801 Returns up to n bytes. If at least one byte is buffered,
802 we only return buffered bytes. Otherwise, we do one
803 raw read.
804 """
805 if n <= 0:
806 return b""
807 self.peek(1, unsafe=True)
808 return self.read(min(n, len(self._read_buf)))
809
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000810 def tell(self):
811 return self.raw.tell() - len(self._read_buf)
812
813 def seek(self, pos, whence=0):
814 if whence == 1:
815 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000816 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000817 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000818 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000819
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000820
Guido van Rossum141f7672007-04-10 00:22:16 +0000821class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000822
Guido van Rossum78892e42007-04-06 17:31:18 +0000823 # XXX docstring
824
Guido van Rossum141f7672007-04-10 00:22:16 +0000825 def __init__(self, raw,
826 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000827 raw._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000828 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000829 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000830 self.max_buffer_size = (2*buffer_size
831 if max_buffer_size is None
832 else max_buffer_size)
Guido van Rossum254348e2007-11-21 19:29:53 +0000833 self._write_buf = bytearray()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000834
835 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000836 if self.closed:
837 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000838 if isinstance(b, str):
839 raise TypeError("can't write str to binary stream")
Guido van Rossum01a27522007-03-07 01:00:12 +0000840 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000841 if len(self._write_buf) > self.buffer_size:
842 # We're full, so let's pre-flush the buffer
843 try:
844 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000845 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000846 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000847 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000848 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000849 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000850 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000851 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000852 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000853 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 if (len(self._write_buf) > self.max_buffer_size):
857 # We've hit max_buffer_size. We have to accept a partial
858 # write and cut back our buffer.
859 overage = len(self._write_buf) - self.max_buffer_size
860 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000861 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000862 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000863
864 def flush(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000865 if self.closed:
866 raise ValueError("flush of closed file")
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000867 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000868 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000869 while self._write_buf:
870 n = self.raw.write(self._write_buf)
871 del self._write_buf[:n]
872 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000873 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000874 n = e.characters_written
875 del self._write_buf[:n]
876 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000877 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000878
879 def tell(self):
880 return self.raw.tell() + len(self._write_buf)
881
882 def seek(self, pos, whence=0):
883 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000884 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000885
Guido van Rossum01a27522007-03-07 01:00:12 +0000886
Guido van Rossum141f7672007-04-10 00:22:16 +0000887class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000888
Guido van Rossum01a27522007-03-07 01:00:12 +0000889 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000890
Guido van Rossum141f7672007-04-10 00:22:16 +0000891 A buffered reader object and buffered writer object put together
892 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000893
894 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000895
896 XXX The usefulness of this (compared to having two separate IO
897 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000898 """
899
Guido van Rossum141f7672007-04-10 00:22:16 +0000900 def __init__(self, reader, writer,
901 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
902 """Constructor.
903
904 The arguments are two RawIO instances.
905 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000906 reader._checkReadable()
907 writer._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000908 self.reader = BufferedReader(reader, buffer_size)
909 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000910
Guido van Rossum024da5c2007-05-17 23:59:11 +0000911 def read(self, n=None):
912 if n is None:
913 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000914 return self.reader.read(n)
915
Guido van Rossum141f7672007-04-10 00:22:16 +0000916 def readinto(self, b):
917 return self.reader.readinto(b)
918
Guido van Rossum01a27522007-03-07 01:00:12 +0000919 def write(self, b):
920 return self.writer.write(b)
921
Guido van Rossum13633bb2007-04-13 18:42:35 +0000922 def peek(self, n=0, *, unsafe=False):
923 return self.reader.peek(n, unsafe=unsafe)
924
925 def read1(self, n):
926 return self.reader.read1(n)
927
Guido van Rossum01a27522007-03-07 01:00:12 +0000928 def readable(self):
929 return self.reader.readable()
930
931 def writable(self):
932 return self.writer.writable()
933
934 def flush(self):
935 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000936
Guido van Rossum01a27522007-03-07 01:00:12 +0000937 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000938 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000939 self.reader.close()
940
941 def isatty(self):
942 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000943
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000944 @property
945 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000946 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000947
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000948
Guido van Rossum141f7672007-04-10 00:22:16 +0000949class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000950
Guido van Rossum78892e42007-04-06 17:31:18 +0000951 # XXX docstring
952
Guido van Rossum141f7672007-04-10 00:22:16 +0000953 def __init__(self, raw,
954 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000955 raw._checkSeekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000956 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000957 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
958
Guido van Rossum01a27522007-03-07 01:00:12 +0000959 def seek(self, pos, whence=0):
960 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000961 # First do the raw seek, then empty the read buffer, so that
962 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000963 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000964 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000965 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000966
967 def tell(self):
968 if (self._write_buf):
969 return self.raw.tell() + len(self._write_buf)
970 else:
971 return self.raw.tell() - len(self._read_buf)
972
Guido van Rossum024da5c2007-05-17 23:59:11 +0000973 def read(self, n=None):
974 if n is None:
975 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000976 self.flush()
977 return BufferedReader.read(self, n)
978
Guido van Rossum141f7672007-04-10 00:22:16 +0000979 def readinto(self, b):
980 self.flush()
981 return BufferedReader.readinto(self, b)
982
Guido van Rossum13633bb2007-04-13 18:42:35 +0000983 def peek(self, n=0, *, unsafe=False):
984 self.flush()
985 return BufferedReader.peek(self, n, unsafe=unsafe)
986
987 def read1(self, n):
988 self.flush()
989 return BufferedReader.read1(self, n)
990
Guido van Rossum01a27522007-03-07 01:00:12 +0000991 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +0000992 if self._read_buf:
993 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
994 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +0000995 return BufferedWriter.write(self, b)
996
Guido van Rossum78892e42007-04-06 17:31:18 +0000997
Guido van Rossumcce92b22007-04-10 14:41:39 +0000998class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +0000999
1000 """Base class for text I/O.
1001
1002 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +00001003
1004 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +00001005 """
1006
1007 def read(self, n: int = -1) -> str:
1008 """read(n: int = -1) -> str. Read at most n characters from stream.
1009
1010 Read from underlying buffer until we have n characters or we hit EOF.
1011 If n is negative or omitted, read until EOF.
1012 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001013 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +00001014
Guido van Rossum9b76da62007-04-11 01:09:03 +00001015 def write(self, s: str) -> int:
1016 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001017 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +00001018
Guido van Rossum9b76da62007-04-11 01:09:03 +00001019 def truncate(self, pos: int = None) -> int:
1020 """truncate(pos: int = None) -> int. Truncate size to pos."""
1021 self.flush()
1022 if pos is None:
1023 pos = self.tell()
1024 self.seek(pos)
1025 return self.buffer.truncate()
1026
Guido van Rossum78892e42007-04-06 17:31:18 +00001027 def readline(self) -> str:
1028 """readline() -> str. Read until newline or EOF.
1029
1030 Returns an empty string if EOF is hit immediately.
1031 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001032 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +00001033
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001034 @property
1035 def encoding(self):
1036 """Subclasses should override."""
1037 return None
1038
Guido van Rossum8358db22007-08-18 21:39:55 +00001039 @property
1040 def newlines(self):
1041 """newlines -> None | str | tuple of str. Line endings translated
1042 so far.
1043
1044 Only line endings translated during reading are considered.
1045
1046 Subclasses should override.
1047 """
1048 return None
1049
Guido van Rossum78892e42007-04-06 17:31:18 +00001050
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001051class IncrementalNewlineDecoder(codecs.IncrementalDecoder):
1052 """Codec used when reading a file in universal newlines mode.
1053 It wraps another incremental decoder, translating \\r\\n and \\r into \\n.
1054 It also records the types of newlines encountered.
1055 When used with translate=False, it ensures that the newline sequence is
1056 returned in one piece.
1057 """
1058 def __init__(self, decoder, translate, errors='strict'):
1059 codecs.IncrementalDecoder.__init__(self, errors=errors)
1060 self.buffer = b''
1061 self.translate = translate
1062 self.decoder = decoder
1063 self.seennl = 0
1064
1065 def decode(self, input, final=False):
1066 # decode input (with the eventual \r from a previous pass)
1067 if self.buffer:
1068 input = self.buffer + input
1069
1070 output = self.decoder.decode(input, final=final)
1071
1072 # retain last \r even when not translating data:
1073 # then readline() is sure to get \r\n in one pass
1074 if output.endswith("\r") and not final:
1075 output = output[:-1]
1076 self.buffer = b'\r'
1077 else:
1078 self.buffer = b''
1079
1080 # Record which newlines are read
1081 crlf = output.count('\r\n')
1082 cr = output.count('\r') - crlf
1083 lf = output.count('\n') - crlf
1084 self.seennl |= (lf and self._LF) | (cr and self._CR) \
1085 | (crlf and self._CRLF)
1086
1087 if self.translate:
1088 if crlf:
1089 output = output.replace("\r\n", "\n")
1090 if cr:
1091 output = output.replace("\r", "\n")
1092
1093 return output
1094
1095 def getstate(self):
1096 buf, flag = self.decoder.getstate()
1097 return buf + self.buffer, flag
1098
1099 def setstate(self, state):
1100 buf, flag = state
1101 if buf.endswith(b'\r'):
1102 self.buffer = b'\r'
1103 buf = buf[:-1]
1104 else:
1105 self.buffer = b''
1106 self.decoder.setstate((buf, flag))
1107
1108 def reset(self):
1109 self.buffer = b''
1110 self.decoder.reset()
1111
1112 _LF = 1
1113 _CR = 2
1114 _CRLF = 4
1115
1116 @property
1117 def newlines(self):
1118 return (None,
1119 "\n",
1120 "\r",
1121 ("\r", "\n"),
1122 "\r\n",
1123 ("\n", "\r\n"),
1124 ("\r", "\r\n"),
1125 ("\r", "\n", "\r\n")
1126 )[self.seennl]
1127
1128
Guido van Rossum78892e42007-04-06 17:31:18 +00001129class TextIOWrapper(TextIOBase):
1130
1131 """Buffered text stream.
1132
1133 Character and line based layer over a BufferedIOBase object.
1134 """
1135
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001136 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +00001137
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001138 def __init__(self, buffer, encoding=None, errors=None, newline=None,
1139 line_buffering=False):
Guido van Rossum8358db22007-08-18 21:39:55 +00001140 if newline not in (None, "", "\n", "\r", "\r\n"):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001141 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +00001142 if encoding is None:
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001143 try:
1144 encoding = os.device_encoding(buffer.fileno())
Brett Cannon041683d2007-10-11 23:08:53 +00001145 except (AttributeError, UnsupportedOperation):
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001146 pass
1147 if encoding is None:
Martin v. Löwisd78d3b42007-08-11 15:36:45 +00001148 try:
1149 import locale
1150 except ImportError:
1151 # Importing locale may fail if Python is being built
1152 encoding = "ascii"
1153 else:
1154 encoding = locale.getpreferredencoding()
Guido van Rossum78892e42007-04-06 17:31:18 +00001155
Christian Heimes8bd14fb2007-11-08 16:34:32 +00001156 if not isinstance(encoding, str):
1157 raise ValueError("invalid encoding: %r" % encoding)
1158
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001159 if errors is None:
1160 errors = "strict"
1161 else:
1162 if not isinstance(errors, str):
1163 raise ValueError("invalid errors: %r" % errors)
1164
Guido van Rossum78892e42007-04-06 17:31:18 +00001165 self.buffer = buffer
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001166 self._line_buffering = line_buffering
Guido van Rossum78892e42007-04-06 17:31:18 +00001167 self._encoding = encoding
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001168 self._errors = errors
Guido van Rossum8358db22007-08-18 21:39:55 +00001169 self._readuniversal = not newline
1170 self._readtranslate = newline is None
1171 self._readnl = newline
1172 self._writetranslate = newline != ''
1173 self._writenl = newline or os.linesep
Guido van Rossum78892e42007-04-06 17:31:18 +00001174 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +00001175 self._pending = ""
1176 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001177 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001178
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001179 @property
1180 def encoding(self):
1181 return self._encoding
1182
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001183 @property
1184 def errors(self):
1185 return self._errors
1186
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001187 @property
1188 def line_buffering(self):
1189 return self._line_buffering
1190
Guido van Rossum9b76da62007-04-11 01:09:03 +00001191 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001192 # tuple (decoder_state, readahead, pending) where decoder_state is
1193 # the second (integer) item of the decoder state, readahead is the
1194 # chunk of bytes that was read, and pending is the characters that
1195 # were rendered by the decoder after feeding it those bytes. We
1196 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001197
1198 def _seekable(self):
1199 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001200
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001201 def flush(self):
1202 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001203 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001204
1205 def close(self):
Guido van Rossum33e7a8e2007-07-22 20:38:07 +00001206 try:
1207 self.flush()
1208 except:
1209 pass # If flush() fails, just give up
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001210 self.buffer.close()
1211
1212 @property
1213 def closed(self):
1214 return self.buffer.closed
1215
Guido van Rossum9be55972007-04-07 02:59:27 +00001216 def fileno(self):
1217 return self.buffer.fileno()
1218
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001219 def isatty(self):
1220 return self.buffer.isatty()
1221
Guido van Rossum78892e42007-04-06 17:31:18 +00001222 def write(self, s: str):
Guido van Rossum4b5386f2007-07-10 09:12:49 +00001223 if self.closed:
1224 raise ValueError("write to closed file")
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001225 if not isinstance(s, str):
Guido van Rossumdcce8392007-08-29 18:10:08 +00001226 raise TypeError("can't write %s to text stream" %
1227 s.__class__.__name__)
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001228 length = len(s)
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001229 haslf = (self._writetranslate or self._line_buffering) and "\n" in s
Guido van Rossum8358db22007-08-18 21:39:55 +00001230 if haslf and self._writetranslate and self._writenl != "\n":
1231 s = s.replace("\n", self._writenl)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001232 # XXX What if we were just reading?
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001233 b = s.encode(self._encoding, self._errors)
Guido van Rossum8358db22007-08-18 21:39:55 +00001234 self.buffer.write(b)
Guido van Rossumf64db9f2007-12-06 01:04:26 +00001235 if self._line_buffering and (haslf or "\r" in s):
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001236 self.flush()
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001237 self._snapshot = None
1238 if self._decoder:
1239 self._decoder.reset()
1240 return length
Guido van Rossum78892e42007-04-06 17:31:18 +00001241
1242 def _get_decoder(self):
1243 make_decoder = codecs.getincrementaldecoder(self._encoding)
1244 if make_decoder is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001245 raise IOError("Can't find an incremental decoder for encoding %s" %
Guido van Rossum78892e42007-04-06 17:31:18 +00001246 self._encoding)
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001247 decoder = make_decoder(self._errors)
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001248 if self._readuniversal:
1249 decoder = IncrementalNewlineDecoder(decoder, self._readtranslate)
1250 self._decoder = decoder
Guido van Rossum78892e42007-04-06 17:31:18 +00001251 return decoder
1252
Guido van Rossum9b76da62007-04-11 01:09:03 +00001253 def _read_chunk(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +00001254 if self._decoder is None:
1255 raise ValueError("no decoder")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001256 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001257 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001258 pending = self._decoder.decode(readahead, not readahead)
1259 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001260 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001261 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001262 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001263 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001264 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001265
1266 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001267 x = 0
1268 for i in bytes(ds):
1269 x = x<<8 | i
1270 return (x<<64) | pos
1271
1272 def _decode_decoder_state(self, pos):
1273 x, pos = divmod(pos, 1<<64)
1274 if not x:
1275 return None, pos
1276 b = b""
1277 while x:
1278 b.append(x&0xff)
1279 x >>= 8
1280 return str(b[::-1]), pos
1281
1282 def tell(self):
1283 if not self._seekable:
1284 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001285 if not self._telling:
1286 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001287 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001288 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001289 decoder = self._decoder
1290 if decoder is None or self._snapshot is None:
Guido van Rossum5abbf752007-08-27 17:39:33 +00001291 if self._pending:
1292 raise ValueError("pending data")
Guido van Rossumcba608c2007-04-11 14:19:59 +00001293 return position
1294 decoder_state, readahead, pending = self._snapshot
1295 position -= len(readahead)
1296 needed = len(pending) - len(self._pending)
1297 if not needed:
1298 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001299 saved_state = decoder.getstate()
1300 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001301 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001302 n = 0
Guido van Rossum254348e2007-11-21 19:29:53 +00001303 bb = bytearray(1)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001304 for i, bb[0] in enumerate(readahead):
1305 n += len(decoder.decode(bb))
1306 if n >= needed:
1307 decoder_buffer, decoder_state = decoder.getstate()
1308 return self._encode_decoder_state(
1309 decoder_state,
Amaury Forgeot d'Arca2d1d7e2007-11-19 21:14:47 +00001310 position + (i+1) - len(decoder_buffer) - (n - needed))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001311 raise IOError("Can't reconstruct logical file position")
1312 finally:
1313 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001314
1315 def seek(self, pos, whence=0):
1316 if not self._seekable:
1317 raise IOError("Underlying stream is not seekable")
1318 if whence == 1:
1319 if pos != 0:
1320 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001321 pos = self.tell()
1322 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001323 if whence == 2:
1324 if pos != 0:
1325 raise IOError("Can't do nonzero end-relative seeks")
1326 self.flush()
1327 pos = self.buffer.seek(0, 2)
1328 self._snapshot = None
1329 self._pending = ""
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001330 if self._decoder:
1331 self._decoder.reset()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001332 return pos
1333 if whence != 0:
1334 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1335 (whence,))
1336 if pos < 0:
1337 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001338 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001339 orig_pos = pos
1340 ds, pos = self._decode_decoder_state(pos)
1341 if not ds:
1342 self.buffer.seek(pos)
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
Guido van Rossumd76e7792007-04-17 02:38:04 +00001348 decoder = self._decoder or self._get_decoder()
1349 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001350 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001351 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001352 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001353 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001354 return orig_pos
1355
Guido van Rossum024da5c2007-05-17 23:59:11 +00001356 def read(self, n=None):
1357 if n is None:
1358 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001359 decoder = self._decoder or self._get_decoder()
1360 res = self._pending
1361 if n < 0:
1362 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001363 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001364 self._snapshot = None
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001365 return res
Guido van Rossum78892e42007-04-06 17:31:18 +00001366 else:
1367 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001368 readahead, pending = self._read_chunk()
1369 res += pending
1370 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001371 break
1372 self._pending = res[n:]
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001373 return res[:n]
Guido van Rossum78892e42007-04-06 17:31:18 +00001374
Guido van Rossum024da5c2007-05-17 23:59:11 +00001375 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001376 self._telling = False
1377 line = self.readline()
1378 if not line:
1379 self._snapshot = None
1380 self._telling = self._seekable
1381 raise StopIteration
1382 return line
1383
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001384 def readline(self, limit=None):
Guido van Rossum98297ee2007-11-06 21:34:58 +00001385 if limit is None:
1386 limit = -1
1387 if limit >= 0:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001388 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001389 line = self.readline()
1390 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001391 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001392 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001393 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001394
Guido van Rossum78892e42007-04-06 17:31:18 +00001395 line = self._pending
1396 start = 0
1397 decoder = self._decoder or self._get_decoder()
1398
Guido van Rossum8358db22007-08-18 21:39:55 +00001399 pos = endpos = None
Guido van Rossum78892e42007-04-06 17:31:18 +00001400 while True:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001401 if self._readtranslate:
1402 # Newlines are already translated, only search for \n
1403 pos = line.find('\n', start)
1404 if pos >= 0:
1405 endpos = pos + 1
1406 break
1407 else:
1408 start = len(line)
1409
1410 elif self._readuniversal:
Guido van Rossum8358db22007-08-18 21:39:55 +00001411 # Universal newline search. Find any of \r, \r\n, \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001412 # The decoder ensures that \r\n are not split in two pieces
Guido van Rossum78892e42007-04-06 17:31:18 +00001413
Guido van Rossum8358db22007-08-18 21:39:55 +00001414 # In C we'd look for these in parallel of course.
1415 nlpos = line.find("\n", start)
1416 crpos = line.find("\r", start)
1417 if crpos == -1:
1418 if nlpos == -1:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001419 # Nothing found
Guido van Rossum8358db22007-08-18 21:39:55 +00001420 start = len(line)
Guido van Rossum78892e42007-04-06 17:31:18 +00001421 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001422 # Found \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001423 endpos = nlpos + 1
Guido van Rossum8358db22007-08-18 21:39:55 +00001424 break
1425 elif nlpos == -1:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001426 # Found lone \r
1427 endpos = crpos + 1
1428 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001429 elif nlpos < crpos:
1430 # Found \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001431 endpos = nlpos + 1
Guido van Rossum78892e42007-04-06 17:31:18 +00001432 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001433 elif nlpos == crpos + 1:
1434 # Found \r\n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001435 endpos = crpos + 2
Guido van Rossum8358db22007-08-18 21:39:55 +00001436 break
1437 else:
1438 # Found \r
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001439 endpos = crpos + 1
Guido van Rossum8358db22007-08-18 21:39:55 +00001440 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001441 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001442 # non-universal
1443 pos = line.find(self._readnl)
1444 if pos >= 0:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001445 endpos = pos + len(self._readnl)
Guido van Rossum8358db22007-08-18 21:39:55 +00001446 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001447
1448 # No line ending seen yet - get more data
Guido van Rossum8358db22007-08-18 21:39:55 +00001449 more_line = ''
Guido van Rossum78892e42007-04-06 17:31:18 +00001450 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001451 readahead, pending = self._read_chunk()
1452 more_line = pending
1453 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001454 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001455 if more_line:
1456 line += more_line
1457 else:
1458 # end of file
1459 self._pending = ''
1460 self._snapshot = None
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001461 return line
Guido van Rossum78892e42007-04-06 17:31:18 +00001462
Guido van Rossum8358db22007-08-18 21:39:55 +00001463 self._pending = line[endpos:]
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001464 return line[:endpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001465
Guido van Rossum8358db22007-08-18 21:39:55 +00001466 @property
1467 def newlines(self):
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001468 return self._decoder.newlines if self._decoder else None
Guido van Rossum024da5c2007-05-17 23:59:11 +00001469
1470class StringIO(TextIOWrapper):
1471
1472 # XXX This is really slow, but fully functional
1473
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001474 def __init__(self, initial_value="", encoding="utf-8",
1475 errors="strict", newline="\n"):
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001476 super(StringIO, self).__init__(BytesIO(),
1477 encoding=encoding,
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001478 errors=errors,
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001479 newline=newline)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001480 if initial_value:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001481 if not isinstance(initial_value, str):
Guido van Rossum34d19282007-08-09 01:03:29 +00001482 initial_value = str(initial_value)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001483 self.write(initial_value)
1484 self.seek(0)
1485
1486 def getvalue(self):
Guido van Rossum34d19282007-08-09 01:03:29 +00001487 self.flush()
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001488 return self.buffer.getvalue().decode(self._encoding, self._errors)