blob: d2d2fbcf887748f8e60d27cce99d278f2706acc1 [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 Rossum2dced8b2007-10-30 17:27:30 +000052def open(file, mode="r", buffering=None, encoding=None, newline=None,
53 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 Rossum8358db22007-08-18 21:39:55 +000064 newline: optional newlines specifier; must be None, '', '\n', '\r'
65 or '\r\n'; all other values are illegal. It controls the
66 handling of line endings. It works as follows:
67
68 * On input, if `newline` is `None`, universal newlines
69 mode is enabled. Lines in the input can end in `'\n'`,
70 `'\r'`, or `'\r\n'`, and these are translated into
71 `'\n'` before being returned to the caller. If it is
72 `''`, universal newline mode is enabled, but line endings
73 are returned to the caller untranslated. If it has any of
74 the other legal values, input lines are only terminated by
75 the given string, and the line ending is returned to the
76 caller untranslated.
77
78 * On output, if `newline` is `None`, any `'\n'`
79 characters written are translated to the system default
80 line separator, `os.linesep`. If `newline` is `''`,
81 no translation takes place. If `newline` is any of the
82 other legal values, any `'\n'` characters written are
83 translated to the given string.
Guido van Rossum17e43e52007-02-27 15:45:13 +000084
Guido van Rossum2dced8b2007-10-30 17:27:30 +000085 closefd: optional argument to keep the underlying file descriptor
86 open when the file is closed. It must not be false when
87 a filename is given.
88
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000089 (*) If a file descriptor is given, it is closed when the returned
Georg Brandl316414e2007-10-30 17:42:20 +000090 I/O object is closed, unless closefd=False is given.
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000091
Guido van Rossum17e43e52007-02-27 15:45:13 +000092 Mode strings characters:
93 'r': open for reading (default)
94 'w': open for writing, truncating the file first
95 'a': open for writing, appending to the end if the file exists
96 'b': binary mode
97 't': text mode (default)
98 '+': open a disk file for updating (implies reading and writing)
Guido van Rossum9be55972007-04-07 02:59:27 +000099 'U': universal newline mode (for backwards compatibility)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000100
101 Constraints:
102 - encoding must not be given when a binary mode is given
103 - buffering must not be zero when a text mode is given
104
105 Returns:
106 Depending on the mode and buffering arguments, either a raw
107 binary stream, a buffered binary stream, or a buffered text
108 stream, open for reading and/or writing.
109 """
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000110 if not isinstance(file, (str, int)):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000111 raise TypeError("invalid file: %r" % file)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000112 if not isinstance(mode, str):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000113 raise TypeError("invalid mode: %r" % mode)
114 if buffering is not None and not isinstance(buffering, int):
115 raise TypeError("invalid buffering: %r" % buffering)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000116 if encoding is not None and not isinstance(encoding, str):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000117 raise TypeError("invalid encoding: %r" % encoding)
Guido van Rossum28524c72007-02-27 05:47:44 +0000118 modes = set(mode)
Guido van Rossum9be55972007-04-07 02:59:27 +0000119 if modes - set("arwb+tU") or len(mode) > len(modes):
Guido van Rossum28524c72007-02-27 05:47:44 +0000120 raise ValueError("invalid mode: %r" % mode)
121 reading = "r" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000122 writing = "w" in modes
Guido van Rossum28524c72007-02-27 05:47:44 +0000123 appending = "a" in modes
124 updating = "+" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000125 text = "t" in modes
126 binary = "b" in modes
Guido van Rossum7165cb12007-07-10 06:54:34 +0000127 if "U" in modes:
128 if writing or appending:
129 raise ValueError("can't use U and writing mode at once")
Guido van Rossum9be55972007-04-07 02:59:27 +0000130 reading = True
Guido van Rossum28524c72007-02-27 05:47:44 +0000131 if text and binary:
132 raise ValueError("can't have text and binary mode at once")
133 if reading + writing + appending > 1:
134 raise ValueError("can't have read/write/append mode at once")
135 if not (reading or writing or appending):
136 raise ValueError("must have exactly one of read/write/append mode")
137 if binary and encoding is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +0000138 raise ValueError("binary mode doesn't take an encoding argument")
139 if binary and newline is not None:
140 raise ValueError("binary mode doesn't take a newline argument")
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000141 raw = FileIO(file,
Guido van Rossum28524c72007-02-27 05:47:44 +0000142 (reading and "r" or "") +
143 (writing and "w" or "") +
144 (appending and "a" or "") +
Guido van Rossum2dced8b2007-10-30 17:27:30 +0000145 (updating and "+" or ""),
146 closefd)
Guido van Rossum28524c72007-02-27 05:47:44 +0000147 if buffering is None:
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000148 buffering = -1
Guido van Rossum5abbf752007-08-27 17:39:33 +0000149 if buffering < 0 and raw.isatty():
150 buffering = 1
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000151 if buffering < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000152 buffering = DEFAULT_BUFFER_SIZE
Guido van Rossum17e43e52007-02-27 15:45:13 +0000153 try:
154 bs = os.fstat(raw.fileno()).st_blksize
155 except (os.error, AttributeError):
Guido van Rossumbb09b212007-03-18 03:36:28 +0000156 pass
157 else:
Guido van Rossum17e43e52007-02-27 15:45:13 +0000158 if bs > 1:
159 buffering = bs
Guido van Rossum28524c72007-02-27 05:47:44 +0000160 if buffering < 0:
161 raise ValueError("invalid buffering size")
162 if buffering == 0:
163 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000164 raw._name = file
165 raw._mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000166 return raw
167 raise ValueError("can't have unbuffered text I/O")
168 if updating:
169 buffer = BufferedRandom(raw, buffering)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000170 elif writing or appending:
Guido van Rossum28524c72007-02-27 05:47:44 +0000171 buffer = BufferedWriter(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000172 elif reading:
Guido van Rossum28524c72007-02-27 05:47:44 +0000173 buffer = BufferedReader(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000174 else:
175 raise ValueError("unknown mode: %r" % mode)
Guido van Rossum28524c72007-02-27 05:47:44 +0000176 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000177 buffer.name = file
178 buffer.mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000179 return buffer
Guido van Rossum13633bb2007-04-13 18:42:35 +0000180 text = TextIOWrapper(buffer, encoding, newline)
181 text.name = file
182 text.mode = mode
183 return text
Guido van Rossum28524c72007-02-27 05:47:44 +0000184
185
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000186class OpenWrapper:
187 """Wrapper for __builtin__.open
188
189 Trick so that open won't become a bound method when stored
190 as a class variable (as dumbdbm does).
191
192 See initstdio() in Python/pythonrun.c.
193 """
194 def __new__(cls, *args, **kwargs):
195 return open(*args, **kwargs)
196
197
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000198class UnsupportedOperation(ValueError, IOError):
199 pass
200
201
Guido van Rossumb7f136e2007-08-22 18:14:10 +0000202class IOBase(metaclass=abc.ABCMeta):
Guido van Rossum28524c72007-02-27 05:47:44 +0000203
Guido van Rossum141f7672007-04-10 00:22:16 +0000204 """Base class for all I/O classes.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000205
Guido van Rossum141f7672007-04-10 00:22:16 +0000206 This class provides dummy implementations for many methods that
Guido van Rossum17e43e52007-02-27 15:45:13 +0000207 derived classes can override selectively; the default
208 implementations represent a file that cannot be read, written or
209 seeked.
210
Guido van Rossum141f7672007-04-10 00:22:16 +0000211 This does not define read(), readinto() and write(), nor
212 readline() and friends, since their signatures vary per layer.
Guido van Rossum53807da2007-04-10 19:01:47 +0000213
214 Not that calling any method (even inquiries) on a closed file is
215 undefined. Implementations may raise IOError in this case.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000216 """
217
Guido van Rossum141f7672007-04-10 00:22:16 +0000218 ### Internal ###
219
220 def _unsupported(self, name: str) -> IOError:
221 """Internal: raise an exception for unsupported operations."""
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000222 raise UnsupportedOperation("%s.%s() not supported" %
223 (self.__class__.__name__, name))
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000224
Guido van Rossum141f7672007-04-10 00:22:16 +0000225 ### Positioning ###
226
Guido van Rossum53807da2007-04-10 19:01:47 +0000227 def seek(self, pos: int, whence: int = 0) -> int:
228 """seek(pos: int, whence: int = 0) -> int. Change stream position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000229
230 Seek to byte offset pos relative to position indicated by whence:
231 0 Start of stream (the default). pos should be >= 0;
232 1 Current position - whence may be negative;
233 2 End of stream - whence usually negative.
Guido van Rossum53807da2007-04-10 19:01:47 +0000234 Returns the new absolute position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000235 """
236 self._unsupported("seek")
237
238 def tell(self) -> int:
239 """tell() -> int. Return current stream position."""
Guido van Rossum53807da2007-04-10 19:01:47 +0000240 return self.seek(0, 1)
Guido van Rossum141f7672007-04-10 00:22:16 +0000241
Guido van Rossum87429772007-04-10 21:06:59 +0000242 def truncate(self, pos: int = None) -> int:
243 """truncate(size: int = None) -> int. Truncate file to size bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000244
245 Size defaults to the current IO position as reported by tell().
Guido van Rossum87429772007-04-10 21:06:59 +0000246 Returns the new size.
Guido van Rossum141f7672007-04-10 00:22:16 +0000247 """
248 self._unsupported("truncate")
249
250 ### Flush and close ###
251
252 def flush(self) -> None:
253 """flush() -> None. Flushes write buffers, if applicable.
254
255 This is a no-op for read-only and non-blocking streams.
256 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000257 # XXX Should this return the number of bytes written???
Guido van Rossum141f7672007-04-10 00:22:16 +0000258
259 __closed = False
260
261 def close(self) -> None:
262 """close() -> None. Flushes and closes the IO object.
263
264 This must be idempotent. It should also set a flag for the
265 'closed' property (see below) to test.
266 """
267 if not self.__closed:
Guido van Rossum469734b2007-07-10 12:00:45 +0000268 try:
269 self.flush()
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000270 except IOError:
271 pass # If flush() fails, just give up
272 self.__closed = True
Guido van Rossum141f7672007-04-10 00:22:16 +0000273
274 def __del__(self) -> None:
275 """Destructor. Calls close()."""
276 # The try/except block is in case this is called at program
277 # exit time, when it's possible that globals have already been
278 # deleted, and then the close() call might fail. Since
279 # there's nothing we can do about such failures and they annoy
280 # the end users, we suppress the traceback.
281 try:
282 self.close()
283 except:
284 pass
285
286 ### Inquiries ###
287
288 def seekable(self) -> bool:
289 """seekable() -> bool. Return whether object supports random access.
290
291 If False, seek(), tell() and truncate() will raise IOError.
292 This method may need to do a test seek().
293 """
294 return False
295
Guido van Rossum5abbf752007-08-27 17:39:33 +0000296 def _checkSeekable(self, msg=None):
297 """Internal: raise an IOError if file is not seekable
298 """
299 if not self.seekable():
300 raise IOError("File or stream is not seekable."
301 if msg is None else msg)
302
303
Guido van Rossum141f7672007-04-10 00:22:16 +0000304 def readable(self) -> bool:
305 """readable() -> bool. Return whether object was opened for reading.
306
307 If False, read() will raise IOError.
308 """
309 return False
310
Guido van Rossum5abbf752007-08-27 17:39:33 +0000311 def _checkReadable(self, msg=None):
312 """Internal: raise an IOError if file is not readable
313 """
314 if not self.readable():
315 raise IOError("File or stream is not readable."
316 if msg is None else msg)
317
Guido van Rossum141f7672007-04-10 00:22:16 +0000318 def writable(self) -> bool:
319 """writable() -> bool. Return whether object was opened for writing.
320
321 If False, write() and truncate() will raise IOError.
322 """
323 return False
324
Guido van Rossum5abbf752007-08-27 17:39:33 +0000325 def _checkWritable(self, msg=None):
326 """Internal: raise an IOError if file is not writable
327 """
328 if not self.writable():
329 raise IOError("File or stream is not writable."
330 if msg is None else msg)
331
Guido van Rossum141f7672007-04-10 00:22:16 +0000332 @property
333 def closed(self):
334 """closed: bool. True iff the file has been closed.
335
336 For backwards compatibility, this is a property, not a predicate.
337 """
338 return self.__closed
339
Guido van Rossum5abbf752007-08-27 17:39:33 +0000340 def _checkClosed(self, msg=None):
341 """Internal: raise an ValueError if file is closed
342 """
343 if self.closed:
344 raise ValueError("I/O operation on closed file."
345 if msg is None else msg)
346
Guido van Rossum141f7672007-04-10 00:22:16 +0000347 ### Context manager ###
348
349 def __enter__(self) -> "IOBase": # That's a forward reference
350 """Context management protocol. Returns self."""
351 return self
352
353 def __exit__(self, *args) -> None:
354 """Context management protocol. Calls close()"""
355 self.close()
356
357 ### Lower-level APIs ###
358
359 # XXX Should these be present even if unimplemented?
360
361 def fileno(self) -> int:
362 """fileno() -> int. Returns underlying file descriptor if one exists.
363
364 Raises IOError if the IO object does not use a file descriptor.
365 """
366 self._unsupported("fileno")
367
368 def isatty(self) -> bool:
369 """isatty() -> int. Returns whether this is an 'interactive' stream.
370
371 Returns False if we don't know.
372 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000373 self._checkClosed()
Guido van Rossum141f7672007-04-10 00:22:16 +0000374 return False
375
Guido van Rossum7165cb12007-07-10 06:54:34 +0000376 ### Readline[s] and writelines ###
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000377
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000378 def readline(self, limit: int = -1) -> bytes:
379 """For backwards compatibility, a (slowish) readline()."""
Guido van Rossum2bf71382007-06-08 00:07:57 +0000380 if hasattr(self, "peek"):
381 def nreadahead():
382 readahead = self.peek(1, unsafe=True)
383 if not readahead:
384 return 1
385 n = (readahead.find(b"\n") + 1) or len(readahead)
386 if limit >= 0:
387 n = min(n, limit)
388 return n
389 else:
390 def nreadahead():
391 return 1
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000392 if limit is None:
393 limit = -1
Guido van Rossum98297ee2007-11-06 21:34:58 +0000394 res = buffer()
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000395 while limit < 0 or len(res) < limit:
Guido van Rossum2bf71382007-06-08 00:07:57 +0000396 b = self.read(nreadahead())
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000397 if not b:
398 break
399 res += b
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000400 if res.endswith(b"\n"):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000401 break
Guido van Rossum98297ee2007-11-06 21:34:58 +0000402 return bytes(res)
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000403
Guido van Rossum7165cb12007-07-10 06:54:34 +0000404 def __iter__(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000405 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000406 return self
407
408 def __next__(self):
409 line = self.readline()
410 if not line:
411 raise StopIteration
412 return line
413
414 def readlines(self, hint=None):
415 if hint is None:
416 return list(self)
417 n = 0
418 lines = []
419 for line in self:
420 lines.append(line)
421 n += len(line)
422 if n >= hint:
423 break
424 return lines
425
426 def writelines(self, lines):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000427 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000428 for line in lines:
429 self.write(line)
430
Guido van Rossum141f7672007-04-10 00:22:16 +0000431
432class RawIOBase(IOBase):
433
434 """Base class for raw binary I/O.
435
436 The read() method is implemented by calling readinto(); derived
437 classes that want to support read() only need to implement
438 readinto() as a primitive operation. In general, readinto()
439 can be more efficient than read().
440
441 (It would be tempting to also provide an implementation of
442 readinto() in terms of read(), in case the latter is a more
443 suitable primitive operation, but that would lead to nasty
444 recursion in case a subclass doesn't implement either.)
445 """
446
Guido van Rossum7165cb12007-07-10 06:54:34 +0000447 def read(self, n: int = -1) -> bytes:
Guido van Rossum78892e42007-04-06 17:31:18 +0000448 """read(n: int) -> bytes. Read and return up to n bytes.
Guido van Rossum01a27522007-03-07 01:00:12 +0000449
450 Returns an empty bytes array on EOF, or None if the object is
451 set not to block and has no data to read.
452 """
Guido van Rossum7165cb12007-07-10 06:54:34 +0000453 if n is None:
454 n = -1
455 if n < 0:
456 return self.readall()
Guido van Rossum98297ee2007-11-06 21:34:58 +0000457 b = buffer(n.__index__())
Guido van Rossum00efead2007-03-07 05:23:25 +0000458 n = self.readinto(b)
459 del b[n:]
Guido van Rossum98297ee2007-11-06 21:34:58 +0000460 return bytes(b)
Guido van Rossum28524c72007-02-27 05:47:44 +0000461
Guido van Rossum7165cb12007-07-10 06:54:34 +0000462 def readall(self):
463 """readall() -> bytes. Read until EOF, using multiple read() call."""
Guido van Rossum98297ee2007-11-06 21:34:58 +0000464 res = buffer()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000465 while True:
466 data = self.read(DEFAULT_BUFFER_SIZE)
467 if not data:
468 break
469 res += data
Guido van Rossum98297ee2007-11-06 21:34:58 +0000470 return bytes(res)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000471
Guido van Rossum141f7672007-04-10 00:22:16 +0000472 def readinto(self, b: bytes) -> int:
473 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
Guido van Rossum78892e42007-04-06 17:31:18 +0000474
475 Returns number of bytes read (0 for EOF), or None if the object
476 is set not to block as has no data to read.
477 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000478 self._unsupported("readinto")
Guido van Rossum28524c72007-02-27 05:47:44 +0000479
Guido van Rossum141f7672007-04-10 00:22:16 +0000480 def write(self, b: bytes) -> int:
Guido van Rossum78892e42007-04-06 17:31:18 +0000481 """write(b: bytes) -> int. Write the given buffer to the IO stream.
Guido van Rossum01a27522007-03-07 01:00:12 +0000482
Guido van Rossum78892e42007-04-06 17:31:18 +0000483 Returns the number of bytes written, which may be less than len(b).
Guido van Rossum01a27522007-03-07 01:00:12 +0000484 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000485 self._unsupported("write")
Guido van Rossum28524c72007-02-27 05:47:44 +0000486
Guido van Rossum78892e42007-04-06 17:31:18 +0000487
Guido van Rossum141f7672007-04-10 00:22:16 +0000488class FileIO(_fileio._FileIO, RawIOBase):
Guido van Rossum28524c72007-02-27 05:47:44 +0000489
Guido van Rossum141f7672007-04-10 00:22:16 +0000490 """Raw I/O implementation for OS files.
Guido van Rossum28524c72007-02-27 05:47:44 +0000491
Guido van Rossum141f7672007-04-10 00:22:16 +0000492 This multiply inherits from _FileIO and RawIOBase to make
493 isinstance(io.FileIO(), io.RawIOBase) return True without
494 requiring that _fileio._FileIO inherits from io.RawIOBase (which
495 would be hard to do since _fileio.c is written in C).
496 """
Guido van Rossuma9e20242007-03-08 00:43:48 +0000497
Guido van Rossum87429772007-04-10 21:06:59 +0000498 def close(self):
499 _fileio._FileIO.close(self)
500 RawIOBase.close(self)
501
Guido van Rossum13633bb2007-04-13 18:42:35 +0000502 @property
503 def name(self):
504 return self._name
505
506 @property
507 def mode(self):
508 return self._mode
509
Guido van Rossuma9e20242007-03-08 00:43:48 +0000510
Guido van Rossumcce92b22007-04-10 14:41:39 +0000511class BufferedIOBase(IOBase):
Guido van Rossum141f7672007-04-10 00:22:16 +0000512
513 """Base class for buffered IO objects.
514
515 The main difference with RawIOBase is that the read() method
516 supports omitting the size argument, and does not have a default
517 implementation that defers to readinto().
518
519 In addition, read(), readinto() and write() may raise
520 BlockingIOError if the underlying raw stream is in non-blocking
521 mode and not ready; unlike their raw counterparts, they will never
522 return None.
523
524 A typical implementation should not inherit from a RawIOBase
525 implementation, but wrap one.
526 """
527
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000528 def read(self, n: int = None) -> bytes:
529 """read(n: int = None) -> bytes. Read and return up to n bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000530
Guido van Rossum024da5c2007-05-17 23:59:11 +0000531 If the argument is omitted, None, or negative, reads and
532 returns all data until EOF.
Guido van Rossum141f7672007-04-10 00:22:16 +0000533
534 If the argument is positive, and the underlying raw stream is
535 not 'interactive', multiple raw reads may be issued to satisfy
536 the byte count (unless EOF is reached first). But for
537 interactive raw streams (XXX and for pipes?), at most one raw
538 read will be issued, and a short result does not imply that
539 EOF is imminent.
540
541 Returns an empty bytes array on EOF.
542
543 Raises BlockingIOError if the underlying raw stream has no
544 data at the moment.
545 """
546 self._unsupported("read")
547
548 def readinto(self, b: bytes) -> int:
549 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
550
551 Like read(), this may issue multiple reads to the underlying
552 raw stream, unless the latter is 'interactive' (XXX or a
553 pipe?).
554
555 Returns the number of bytes read (0 for EOF).
556
557 Raises BlockingIOError if the underlying raw stream has no
558 data at the moment.
559 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000560 # XXX This ought to work with anything that supports the buffer API
Guido van Rossum87429772007-04-10 21:06:59 +0000561 data = self.read(len(b))
562 n = len(data)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000563 try:
564 b[:n] = data
565 except TypeError as err:
566 import array
567 if not isinstance(b, array.array):
568 raise err
569 b[:n] = array.array('b', data)
Guido van Rossum87429772007-04-10 21:06:59 +0000570 return n
Guido van Rossum141f7672007-04-10 00:22:16 +0000571
572 def write(self, b: bytes) -> int:
573 """write(b: bytes) -> int. Write the given buffer to the IO stream.
574
575 Returns the number of bytes written, which is never less than
576 len(b).
577
578 Raises BlockingIOError if the buffer is full and the
579 underlying raw stream cannot accept more data at the moment.
580 """
581 self._unsupported("write")
582
583
584class _BufferedIOMixin(BufferedIOBase):
585
586 """A mixin implementation of BufferedIOBase with an underlying raw stream.
587
588 This passes most requests on to the underlying raw stream. It
589 does *not* provide implementations of read(), readinto() or
590 write().
591 """
592
593 def __init__(self, raw):
594 self.raw = raw
595
596 ### Positioning ###
597
598 def seek(self, pos, whence=0):
Guido van Rossum53807da2007-04-10 19:01:47 +0000599 return self.raw.seek(pos, whence)
Guido van Rossum141f7672007-04-10 00:22:16 +0000600
601 def tell(self):
602 return self.raw.tell()
603
604 def truncate(self, pos=None):
Guido van Rossum79b79ee2007-10-25 23:21:03 +0000605 # Flush the stream. We're mixing buffered I/O with lower-level I/O,
606 # and a flush may be necessary to synch both views of the current
607 # file state.
608 self.flush()
Guido van Rossum57233cb2007-10-26 17:19:33 +0000609
610 if pos is None:
611 pos = self.tell()
612 return self.raw.truncate(pos)
Guido van Rossum141f7672007-04-10 00:22:16 +0000613
614 ### Flush and close ###
615
616 def flush(self):
617 self.raw.flush()
618
619 def close(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000620 if not self.closed:
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000621 try:
622 self.flush()
623 except IOError:
624 pass # If flush() fails, just give up
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000625 self.raw.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000626
627 ### Inquiries ###
628
629 def seekable(self):
630 return self.raw.seekable()
631
632 def readable(self):
633 return self.raw.readable()
634
635 def writable(self):
636 return self.raw.writable()
637
638 @property
639 def closed(self):
640 return self.raw.closed
641
642 ### Lower-level APIs ###
643
644 def fileno(self):
645 return self.raw.fileno()
646
647 def isatty(self):
648 return self.raw.isatty()
649
650
Guido van Rossum024da5c2007-05-17 23:59:11 +0000651class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000652
Guido van Rossum024da5c2007-05-17 23:59:11 +0000653 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000654
Guido van Rossum024da5c2007-05-17 23:59:11 +0000655 # XXX More docs
656
657 def __init__(self, initial_bytes=None):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000658 buf = buffer()
Guido van Rossum024da5c2007-05-17 23:59:11 +0000659 if initial_bytes is not None:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000660 buf += initial_bytes
661 self._buffer = buf
Guido van Rossum28524c72007-02-27 05:47:44 +0000662 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000663
664 def getvalue(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000665 return bytes(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000666
Guido van Rossum024da5c2007-05-17 23:59:11 +0000667 def read(self, n=None):
668 if n is None:
669 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000670 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000671 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000672 newpos = min(len(self._buffer), self._pos + n)
673 b = self._buffer[self._pos : newpos]
674 self._pos = newpos
Guido van Rossum98297ee2007-11-06 21:34:58 +0000675 return bytes(b)
Guido van Rossum28524c72007-02-27 05:47:44 +0000676
Guido van Rossum024da5c2007-05-17 23:59:11 +0000677 def read1(self, n):
678 return self.read(n)
679
Guido van Rossum28524c72007-02-27 05:47:44 +0000680 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000681 if self.closed:
682 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000683 if isinstance(b, str):
684 raise TypeError("can't write str to binary stream")
Guido van Rossum28524c72007-02-27 05:47:44 +0000685 n = len(b)
686 newpos = self._pos + n
Guido van Rossumb972a782007-07-21 00:25:15 +0000687 if newpos > len(self._buffer):
688 # Inserts null bytes between the current end of the file
689 # and the new write position.
Guido van Rossuma74184e2007-08-29 04:05:57 +0000690 padding = b'\x00' * (newpos - len(self._buffer) - n)
Guido van Rossumb972a782007-07-21 00:25:15 +0000691 self._buffer[self._pos:newpos - n] = padding
Guido van Rossum28524c72007-02-27 05:47:44 +0000692 self._buffer[self._pos:newpos] = b
693 self._pos = newpos
694 return n
695
696 def seek(self, pos, whence=0):
Christian Heimes3ab4f652007-11-09 01:27:29 +0000697 try:
698 pos = pos.__index__()
699 except AttributeError as err:
700 raise TypeError("an integer is required") from err
Guido van Rossum28524c72007-02-27 05:47:44 +0000701 if whence == 0:
702 self._pos = max(0, pos)
703 elif whence == 1:
704 self._pos = max(0, self._pos + pos)
705 elif whence == 2:
706 self._pos = max(0, len(self._buffer) + pos)
707 else:
708 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000709 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000710
711 def tell(self):
712 return self._pos
713
714 def truncate(self, pos=None):
715 if pos is None:
716 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000717 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000718 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000719
720 def readable(self):
721 return True
722
723 def writable(self):
724 return True
725
726 def seekable(self):
727 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000728
729
Guido van Rossum141f7672007-04-10 00:22:16 +0000730class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000731
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000732 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000733
Guido van Rossum78892e42007-04-06 17:31:18 +0000734 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000735 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000736 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000737 raw._checkReadable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000738 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000739 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000740 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000741
Guido van Rossum024da5c2007-05-17 23:59:11 +0000742 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000743 """Read n bytes.
744
745 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000746 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000747 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000748 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000749 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000750 if n is None:
751 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000752 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000753 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000754 to_read = max(self.buffer_size,
755 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000756 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000757 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000758 nodata_val = current
759 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000760 self._read_buf += current
761 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000762 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000763 n = len(self._read_buf)
764 out = self._read_buf[:n]
765 self._read_buf = self._read_buf[n:]
766 else:
767 out = nodata_val
768 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000769
Guido van Rossum13633bb2007-04-13 18:42:35 +0000770 def peek(self, n=0, *, unsafe=False):
771 """Returns buffered bytes without advancing the position.
772
773 The argument indicates a desired minimal number of bytes; we
774 do at most one raw read to satisfy it. We never return more
775 than self.buffer_size.
776
777 Unless unsafe=True is passed, we return a copy.
778 """
779 want = min(n, self.buffer_size)
780 have = len(self._read_buf)
781 if have < want:
782 to_read = self.buffer_size - have
783 current = self.raw.read(to_read)
784 if current:
785 self._read_buf += current
786 result = self._read_buf
787 if unsafe:
788 result = result[:]
789 return result
790
791 def read1(self, n):
792 """Reads up to n bytes.
793
794 Returns up to n bytes. If at least one byte is buffered,
795 we only return buffered bytes. Otherwise, we do one
796 raw read.
797 """
798 if n <= 0:
799 return b""
800 self.peek(1, unsafe=True)
801 return self.read(min(n, len(self._read_buf)))
802
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000803 def tell(self):
804 return self.raw.tell() - len(self._read_buf)
805
806 def seek(self, pos, whence=0):
807 if whence == 1:
808 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000809 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000810 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000811 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000812
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000813
Guido van Rossum141f7672007-04-10 00:22:16 +0000814class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000815
Guido van Rossum78892e42007-04-06 17:31:18 +0000816 # XXX docstring
817
Guido van Rossum141f7672007-04-10 00:22:16 +0000818 def __init__(self, raw,
819 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000820 raw._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000821 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000822 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000823 self.max_buffer_size = (2*buffer_size
824 if max_buffer_size is None
825 else max_buffer_size)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000826 self._write_buf = buffer()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000827
828 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000829 if self.closed:
830 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000831 if isinstance(b, str):
832 raise TypeError("can't write str to binary stream")
Guido van Rossum01a27522007-03-07 01:00:12 +0000833 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000834 if len(self._write_buf) > self.buffer_size:
835 # We're full, so let's pre-flush the buffer
836 try:
837 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000838 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000839 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000840 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000841 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000842 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000843 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000844 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000845 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000846 try:
847 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000848 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000849 if (len(self._write_buf) > self.max_buffer_size):
850 # We've hit max_buffer_size. We have to accept a partial
851 # write and cut back our buffer.
852 overage = len(self._write_buf) - self.max_buffer_size
853 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000854 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000855 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000856
857 def flush(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000858 if self.closed:
859 raise ValueError("flush of closed file")
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000860 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000861 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000862 while self._write_buf:
863 n = self.raw.write(self._write_buf)
864 del self._write_buf[:n]
865 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000866 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000867 n = e.characters_written
868 del self._write_buf[:n]
869 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000870 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000871
872 def tell(self):
873 return self.raw.tell() + len(self._write_buf)
874
875 def seek(self, pos, whence=0):
876 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000877 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000878
Guido van Rossum01a27522007-03-07 01:00:12 +0000879
Guido van Rossum141f7672007-04-10 00:22:16 +0000880class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000881
Guido van Rossum01a27522007-03-07 01:00:12 +0000882 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000883
Guido van Rossum141f7672007-04-10 00:22:16 +0000884 A buffered reader object and buffered writer object put together
885 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000886
887 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000888
889 XXX The usefulness of this (compared to having two separate IO
890 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000891 """
892
Guido van Rossum141f7672007-04-10 00:22:16 +0000893 def __init__(self, reader, writer,
894 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
895 """Constructor.
896
897 The arguments are two RawIO instances.
898 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000899 reader._checkReadable()
900 writer._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000901 self.reader = BufferedReader(reader, buffer_size)
902 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000903
Guido van Rossum024da5c2007-05-17 23:59:11 +0000904 def read(self, n=None):
905 if n is None:
906 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000907 return self.reader.read(n)
908
Guido van Rossum141f7672007-04-10 00:22:16 +0000909 def readinto(self, b):
910 return self.reader.readinto(b)
911
Guido van Rossum01a27522007-03-07 01:00:12 +0000912 def write(self, b):
913 return self.writer.write(b)
914
Guido van Rossum13633bb2007-04-13 18:42:35 +0000915 def peek(self, n=0, *, unsafe=False):
916 return self.reader.peek(n, unsafe=unsafe)
917
918 def read1(self, n):
919 return self.reader.read1(n)
920
Guido van Rossum01a27522007-03-07 01:00:12 +0000921 def readable(self):
922 return self.reader.readable()
923
924 def writable(self):
925 return self.writer.writable()
926
927 def flush(self):
928 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000929
Guido van Rossum01a27522007-03-07 01:00:12 +0000930 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000931 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000932 self.reader.close()
933
934 def isatty(self):
935 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000936
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000937 @property
938 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000939 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000940
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000941
Guido van Rossum141f7672007-04-10 00:22:16 +0000942class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000943
Guido van Rossum78892e42007-04-06 17:31:18 +0000944 # XXX docstring
945
Guido van Rossum141f7672007-04-10 00:22:16 +0000946 def __init__(self, raw,
947 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000948 raw._checkSeekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000949 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000950 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
951
Guido van Rossum01a27522007-03-07 01:00:12 +0000952 def seek(self, pos, whence=0):
953 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000954 # First do the raw seek, then empty the read buffer, so that
955 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000956 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000957 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000958 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000959
960 def tell(self):
961 if (self._write_buf):
962 return self.raw.tell() + len(self._write_buf)
963 else:
964 return self.raw.tell() - len(self._read_buf)
965
Guido van Rossum024da5c2007-05-17 23:59:11 +0000966 def read(self, n=None):
967 if n is None:
968 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000969 self.flush()
970 return BufferedReader.read(self, n)
971
Guido van Rossum141f7672007-04-10 00:22:16 +0000972 def readinto(self, b):
973 self.flush()
974 return BufferedReader.readinto(self, b)
975
Guido van Rossum13633bb2007-04-13 18:42:35 +0000976 def peek(self, n=0, *, unsafe=False):
977 self.flush()
978 return BufferedReader.peek(self, n, unsafe=unsafe)
979
980 def read1(self, n):
981 self.flush()
982 return BufferedReader.read1(self, n)
983
Guido van Rossum01a27522007-03-07 01:00:12 +0000984 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +0000985 if self._read_buf:
986 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
987 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +0000988 return BufferedWriter.write(self, b)
989
Guido van Rossum78892e42007-04-06 17:31:18 +0000990
Guido van Rossumcce92b22007-04-10 14:41:39 +0000991class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +0000992
993 """Base class for text I/O.
994
995 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +0000996
997 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +0000998 """
999
1000 def read(self, n: int = -1) -> str:
1001 """read(n: int = -1) -> str. Read at most n characters from stream.
1002
1003 Read from underlying buffer until we have n characters or we hit EOF.
1004 If n is negative or omitted, read until EOF.
1005 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001006 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +00001007
Guido van Rossum9b76da62007-04-11 01:09:03 +00001008 def write(self, s: str) -> int:
1009 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001010 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +00001011
Guido van Rossum9b76da62007-04-11 01:09:03 +00001012 def truncate(self, pos: int = None) -> int:
1013 """truncate(pos: int = None) -> int. Truncate size to pos."""
1014 self.flush()
1015 if pos is None:
1016 pos = self.tell()
1017 self.seek(pos)
1018 return self.buffer.truncate()
1019
Guido van Rossum78892e42007-04-06 17:31:18 +00001020 def readline(self) -> str:
1021 """readline() -> str. Read until newline or EOF.
1022
1023 Returns an empty string if EOF is hit immediately.
1024 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001025 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +00001026
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001027 @property
1028 def encoding(self):
1029 """Subclasses should override."""
1030 return None
1031
Guido van Rossum8358db22007-08-18 21:39:55 +00001032 @property
1033 def newlines(self):
1034 """newlines -> None | str | tuple of str. Line endings translated
1035 so far.
1036
1037 Only line endings translated during reading are considered.
1038
1039 Subclasses should override.
1040 """
1041 return None
1042
Guido van Rossum78892e42007-04-06 17:31:18 +00001043
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001044class IncrementalNewlineDecoder(codecs.IncrementalDecoder):
1045 """Codec used when reading a file in universal newlines mode.
1046 It wraps another incremental decoder, translating \\r\\n and \\r into \\n.
1047 It also records the types of newlines encountered.
1048 When used with translate=False, it ensures that the newline sequence is
1049 returned in one piece.
1050 """
1051 def __init__(self, decoder, translate, errors='strict'):
1052 codecs.IncrementalDecoder.__init__(self, errors=errors)
1053 self.buffer = b''
1054 self.translate = translate
1055 self.decoder = decoder
1056 self.seennl = 0
1057
1058 def decode(self, input, final=False):
1059 # decode input (with the eventual \r from a previous pass)
1060 if self.buffer:
1061 input = self.buffer + input
1062
1063 output = self.decoder.decode(input, final=final)
1064
1065 # retain last \r even when not translating data:
1066 # then readline() is sure to get \r\n in one pass
1067 if output.endswith("\r") and not final:
1068 output = output[:-1]
1069 self.buffer = b'\r'
1070 else:
1071 self.buffer = b''
1072
1073 # Record which newlines are read
1074 crlf = output.count('\r\n')
1075 cr = output.count('\r') - crlf
1076 lf = output.count('\n') - crlf
1077 self.seennl |= (lf and self._LF) | (cr and self._CR) \
1078 | (crlf and self._CRLF)
1079
1080 if self.translate:
1081 if crlf:
1082 output = output.replace("\r\n", "\n")
1083 if cr:
1084 output = output.replace("\r", "\n")
1085
1086 return output
1087
1088 def getstate(self):
1089 buf, flag = self.decoder.getstate()
1090 return buf + self.buffer, flag
1091
1092 def setstate(self, state):
1093 buf, flag = state
1094 if buf.endswith(b'\r'):
1095 self.buffer = b'\r'
1096 buf = buf[:-1]
1097 else:
1098 self.buffer = b''
1099 self.decoder.setstate((buf, flag))
1100
1101 def reset(self):
1102 self.buffer = b''
1103 self.decoder.reset()
1104
1105 _LF = 1
1106 _CR = 2
1107 _CRLF = 4
1108
1109 @property
1110 def newlines(self):
1111 return (None,
1112 "\n",
1113 "\r",
1114 ("\r", "\n"),
1115 "\r\n",
1116 ("\n", "\r\n"),
1117 ("\r", "\r\n"),
1118 ("\r", "\n", "\r\n")
1119 )[self.seennl]
1120
1121
Guido van Rossum78892e42007-04-06 17:31:18 +00001122class TextIOWrapper(TextIOBase):
1123
1124 """Buffered text stream.
1125
1126 Character and line based layer over a BufferedIOBase object.
1127 """
1128
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001129 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +00001130
1131 def __init__(self, buffer, encoding=None, newline=None):
Guido van Rossum8358db22007-08-18 21:39:55 +00001132 if newline not in (None, "", "\n", "\r", "\r\n"):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001133 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +00001134 if encoding is None:
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001135 try:
1136 encoding = os.device_encoding(buffer.fileno())
Brett Cannon041683d2007-10-11 23:08:53 +00001137 except (AttributeError, UnsupportedOperation):
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001138 pass
1139 if encoding is None:
Martin v. Löwisd78d3b42007-08-11 15:36:45 +00001140 try:
1141 import locale
1142 except ImportError:
1143 # Importing locale may fail if Python is being built
1144 encoding = "ascii"
1145 else:
1146 encoding = locale.getpreferredencoding()
Guido van Rossum78892e42007-04-06 17:31:18 +00001147
Christian Heimes8bd14fb2007-11-08 16:34:32 +00001148 if not isinstance(encoding, str):
1149 raise ValueError("invalid encoding: %r" % encoding)
1150
Guido van Rossum78892e42007-04-06 17:31:18 +00001151 self.buffer = buffer
1152 self._encoding = encoding
Guido van Rossum8358db22007-08-18 21:39:55 +00001153 self._readuniversal = not newline
1154 self._readtranslate = newline is None
1155 self._readnl = newline
1156 self._writetranslate = newline != ''
1157 self._writenl = newline or os.linesep
Guido van Rossum78892e42007-04-06 17:31:18 +00001158 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +00001159 self._pending = ""
1160 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001161 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001162
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001163 @property
1164 def encoding(self):
1165 return self._encoding
1166
Guido van Rossum9b76da62007-04-11 01:09:03 +00001167 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001168 # tuple (decoder_state, readahead, pending) where decoder_state is
1169 # the second (integer) item of the decoder state, readahead is the
1170 # chunk of bytes that was read, and pending is the characters that
1171 # were rendered by the decoder after feeding it those bytes. We
1172 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001173
1174 def _seekable(self):
1175 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001176
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001177 def flush(self):
1178 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001179 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001180
1181 def close(self):
Guido van Rossum33e7a8e2007-07-22 20:38:07 +00001182 try:
1183 self.flush()
1184 except:
1185 pass # If flush() fails, just give up
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001186 self.buffer.close()
1187
1188 @property
1189 def closed(self):
1190 return self.buffer.closed
1191
Guido van Rossum9be55972007-04-07 02:59:27 +00001192 def fileno(self):
1193 return self.buffer.fileno()
1194
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001195 def isatty(self):
1196 return self.buffer.isatty()
1197
Guido van Rossum78892e42007-04-06 17:31:18 +00001198 def write(self, s: str):
Guido van Rossum4b5386f2007-07-10 09:12:49 +00001199 if self.closed:
1200 raise ValueError("write to closed file")
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001201 if not isinstance(s, str):
Guido van Rossumdcce8392007-08-29 18:10:08 +00001202 raise TypeError("can't write %s to text stream" %
1203 s.__class__.__name__)
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001204 length = len(s)
Guido van Rossum8358db22007-08-18 21:39:55 +00001205 haslf = "\n" in s
1206 if haslf and self._writetranslate and self._writenl != "\n":
1207 s = s.replace("\n", self._writenl)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001208 # XXX What if we were just reading?
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001209 b = s.encode(self._encoding)
Guido van Rossum8358db22007-08-18 21:39:55 +00001210 self.buffer.write(b)
1211 if haslf and self.isatty():
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001212 self.flush()
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001213 self._snapshot = None
1214 if self._decoder:
1215 self._decoder.reset()
1216 return length
Guido van Rossum78892e42007-04-06 17:31:18 +00001217
1218 def _get_decoder(self):
1219 make_decoder = codecs.getincrementaldecoder(self._encoding)
1220 if make_decoder is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001221 raise IOError("Can't find an incremental decoder for encoding %s" %
Guido van Rossum78892e42007-04-06 17:31:18 +00001222 self._encoding)
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001223 decoder = make_decoder() # XXX: errors
1224 if self._readuniversal:
1225 decoder = IncrementalNewlineDecoder(decoder, self._readtranslate)
1226 self._decoder = decoder
Guido van Rossum78892e42007-04-06 17:31:18 +00001227 return decoder
1228
Guido van Rossum9b76da62007-04-11 01:09:03 +00001229 def _read_chunk(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +00001230 if self._decoder is None:
1231 raise ValueError("no decoder")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001232 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001233 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001234 pending = self._decoder.decode(readahead, not readahead)
1235 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001236 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001237 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001238 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001239 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001240 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001241
1242 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001243 x = 0
1244 for i in bytes(ds):
1245 x = x<<8 | i
1246 return (x<<64) | pos
1247
1248 def _decode_decoder_state(self, pos):
1249 x, pos = divmod(pos, 1<<64)
1250 if not x:
1251 return None, pos
1252 b = b""
1253 while x:
1254 b.append(x&0xff)
1255 x >>= 8
1256 return str(b[::-1]), pos
1257
1258 def tell(self):
1259 if not self._seekable:
1260 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001261 if not self._telling:
1262 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001263 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001264 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001265 decoder = self._decoder
1266 if decoder is None or self._snapshot is None:
Guido van Rossum5abbf752007-08-27 17:39:33 +00001267 if self._pending:
1268 raise ValueError("pending data")
Guido van Rossumcba608c2007-04-11 14:19:59 +00001269 return position
1270 decoder_state, readahead, pending = self._snapshot
1271 position -= len(readahead)
1272 needed = len(pending) - len(self._pending)
1273 if not needed:
1274 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001275 saved_state = decoder.getstate()
1276 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001277 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001278 n = 0
Guido van Rossum98297ee2007-11-06 21:34:58 +00001279 bb = buffer(1)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001280 for i, bb[0] in enumerate(readahead):
1281 n += len(decoder.decode(bb))
1282 if n >= needed:
1283 decoder_buffer, decoder_state = decoder.getstate()
1284 return self._encode_decoder_state(
1285 decoder_state,
1286 position + (i+1) - len(decoder_buffer))
1287 raise IOError("Can't reconstruct logical file position")
1288 finally:
1289 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001290
1291 def seek(self, pos, whence=0):
1292 if not self._seekable:
1293 raise IOError("Underlying stream is not seekable")
1294 if whence == 1:
1295 if pos != 0:
1296 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001297 pos = self.tell()
1298 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001299 if whence == 2:
1300 if pos != 0:
1301 raise IOError("Can't do nonzero end-relative seeks")
1302 self.flush()
1303 pos = self.buffer.seek(0, 2)
1304 self._snapshot = None
1305 self._pending = ""
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001306 if self._decoder:
1307 self._decoder.reset()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001308 return pos
1309 if whence != 0:
1310 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1311 (whence,))
1312 if pos < 0:
1313 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001314 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001315 orig_pos = pos
1316 ds, pos = self._decode_decoder_state(pos)
1317 if not ds:
1318 self.buffer.seek(pos)
1319 self._snapshot = None
1320 self._pending = ""
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001321 if self._decoder:
1322 self._decoder.reset()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001323 return pos
Guido van Rossumd76e7792007-04-17 02:38:04 +00001324 decoder = self._decoder or self._get_decoder()
1325 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001326 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001327 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001328 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001329 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001330 return orig_pos
1331
Guido van Rossum024da5c2007-05-17 23:59:11 +00001332 def read(self, n=None):
1333 if n is None:
1334 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001335 decoder = self._decoder or self._get_decoder()
1336 res = self._pending
1337 if n < 0:
1338 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001339 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001340 self._snapshot = None
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001341 return res
Guido van Rossum78892e42007-04-06 17:31:18 +00001342 else:
1343 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001344 readahead, pending = self._read_chunk()
1345 res += pending
1346 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001347 break
1348 self._pending = res[n:]
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001349 return res[:n]
Guido van Rossum78892e42007-04-06 17:31:18 +00001350
Guido van Rossum024da5c2007-05-17 23:59:11 +00001351 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001352 self._telling = False
1353 line = self.readline()
1354 if not line:
1355 self._snapshot = None
1356 self._telling = self._seekable
1357 raise StopIteration
1358 return line
1359
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001360 def readline(self, limit=None):
Guido van Rossum98297ee2007-11-06 21:34:58 +00001361 if limit is None:
1362 limit = -1
1363 if limit >= 0:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001364 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001365 line = self.readline()
1366 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001367 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001368 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001369 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001370
Guido van Rossum78892e42007-04-06 17:31:18 +00001371 line = self._pending
1372 start = 0
1373 decoder = self._decoder or self._get_decoder()
1374
Guido van Rossum8358db22007-08-18 21:39:55 +00001375 pos = endpos = None
Guido van Rossum78892e42007-04-06 17:31:18 +00001376 while True:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001377 if self._readtranslate:
1378 # Newlines are already translated, only search for \n
1379 pos = line.find('\n', start)
1380 if pos >= 0:
1381 endpos = pos + 1
1382 break
1383 else:
1384 start = len(line)
1385
1386 elif self._readuniversal:
Guido van Rossum8358db22007-08-18 21:39:55 +00001387 # Universal newline search. Find any of \r, \r\n, \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001388 # The decoder ensures that \r\n are not split in two pieces
Guido van Rossum78892e42007-04-06 17:31:18 +00001389
Guido van Rossum8358db22007-08-18 21:39:55 +00001390 # In C we'd look for these in parallel of course.
1391 nlpos = line.find("\n", start)
1392 crpos = line.find("\r", start)
1393 if crpos == -1:
1394 if nlpos == -1:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001395 # Nothing found
Guido van Rossum8358db22007-08-18 21:39:55 +00001396 start = len(line)
Guido van Rossum78892e42007-04-06 17:31:18 +00001397 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001398 # Found \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001399 endpos = nlpos + 1
Guido van Rossum8358db22007-08-18 21:39:55 +00001400 break
1401 elif nlpos == -1:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001402 # Found lone \r
1403 endpos = crpos + 1
1404 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001405 elif nlpos < crpos:
1406 # Found \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001407 endpos = nlpos + 1
Guido van Rossum78892e42007-04-06 17:31:18 +00001408 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001409 elif nlpos == crpos + 1:
1410 # Found \r\n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001411 endpos = crpos + 2
Guido van Rossum8358db22007-08-18 21:39:55 +00001412 break
1413 else:
1414 # Found \r
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001415 endpos = crpos + 1
Guido van Rossum8358db22007-08-18 21:39:55 +00001416 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001417 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001418 # non-universal
1419 pos = line.find(self._readnl)
1420 if pos >= 0:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001421 endpos = pos + len(self._readnl)
Guido van Rossum8358db22007-08-18 21:39:55 +00001422 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001423
1424 # No line ending seen yet - get more data
Guido van Rossum8358db22007-08-18 21:39:55 +00001425 more_line = ''
Guido van Rossum78892e42007-04-06 17:31:18 +00001426 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001427 readahead, pending = self._read_chunk()
1428 more_line = pending
1429 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001430 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001431 if more_line:
1432 line += more_line
1433 else:
1434 # end of file
1435 self._pending = ''
1436 self._snapshot = None
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001437 return line
Guido van Rossum78892e42007-04-06 17:31:18 +00001438
Guido van Rossum8358db22007-08-18 21:39:55 +00001439 self._pending = line[endpos:]
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001440 return line[:endpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001441
Guido van Rossum8358db22007-08-18 21:39:55 +00001442 @property
1443 def newlines(self):
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001444 return self._decoder.newlines if self._decoder else None
Guido van Rossum024da5c2007-05-17 23:59:11 +00001445
1446class StringIO(TextIOWrapper):
1447
1448 # XXX This is really slow, but fully functional
1449
Guido van Rossume86254e2007-08-29 18:31:16 +00001450 def __init__(self, initial_value="", encoding="utf-8", newline="\n"):
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001451 super(StringIO, self).__init__(BytesIO(),
1452 encoding=encoding,
1453 newline=newline)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001454 if initial_value:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001455 if not isinstance(initial_value, str):
Guido van Rossum34d19282007-08-09 01:03:29 +00001456 initial_value = str(initial_value)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001457 self.write(initial_value)
1458 self.seek(0)
1459
1460 def getvalue(self):
Guido van Rossum34d19282007-08-09 01:03:29 +00001461 self.flush()
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001462 return self.buffer.getvalue().decode(self._encoding)