blob: a72e3fd7e3989253332802cf32100786284c7d76 [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 Rossum5abbf752007-08-27 17:39:33 +0000154 if buffering < 0 and raw.isatty():
155 buffering = 1
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000156 if buffering < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000157 buffering = DEFAULT_BUFFER_SIZE
Guido van Rossum17e43e52007-02-27 15:45:13 +0000158 try:
159 bs = os.fstat(raw.fileno()).st_blksize
160 except (os.error, AttributeError):
Guido van Rossumbb09b212007-03-18 03:36:28 +0000161 pass
162 else:
Guido van Rossum17e43e52007-02-27 15:45:13 +0000163 if bs > 1:
164 buffering = bs
Guido van Rossum28524c72007-02-27 05:47:44 +0000165 if buffering < 0:
166 raise ValueError("invalid buffering size")
167 if buffering == 0:
168 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000169 raw._name = file
170 raw._mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000171 return raw
172 raise ValueError("can't have unbuffered text I/O")
173 if updating:
174 buffer = BufferedRandom(raw, buffering)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000175 elif writing or appending:
Guido van Rossum28524c72007-02-27 05:47:44 +0000176 buffer = BufferedWriter(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000177 elif reading:
Guido van Rossum28524c72007-02-27 05:47:44 +0000178 buffer = BufferedReader(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000179 else:
180 raise ValueError("unknown mode: %r" % mode)
Guido van Rossum28524c72007-02-27 05:47:44 +0000181 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000182 buffer.name = file
183 buffer.mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000184 return buffer
Guido van Rossume7fc50f2007-12-03 22:54:21 +0000185 text = TextIOWrapper(buffer, encoding, errors, newline)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000186 text.name = file
187 text.mode = mode
188 return text
Guido van Rossum28524c72007-02-27 05:47:44 +0000189
190
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000191class OpenWrapper:
Georg Brandl1a3284e2007-12-02 09:40:06 +0000192 """Wrapper for builtins.open
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000193
194 Trick so that open won't become a bound method when stored
195 as a class variable (as dumbdbm does).
196
197 See initstdio() in Python/pythonrun.c.
198 """
199 def __new__(cls, *args, **kwargs):
200 return open(*args, **kwargs)
201
202
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000203class UnsupportedOperation(ValueError, IOError):
204 pass
205
206
Guido van Rossumb7f136e2007-08-22 18:14:10 +0000207class IOBase(metaclass=abc.ABCMeta):
Guido van Rossum28524c72007-02-27 05:47:44 +0000208
Guido van Rossum141f7672007-04-10 00:22:16 +0000209 """Base class for all I/O classes.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000210
Guido van Rossum141f7672007-04-10 00:22:16 +0000211 This class provides dummy implementations for many methods that
Guido van Rossum17e43e52007-02-27 15:45:13 +0000212 derived classes can override selectively; the default
213 implementations represent a file that cannot be read, written or
214 seeked.
215
Guido van Rossum141f7672007-04-10 00:22:16 +0000216 This does not define read(), readinto() and write(), nor
217 readline() and friends, since their signatures vary per layer.
Guido van Rossum53807da2007-04-10 19:01:47 +0000218
219 Not that calling any method (even inquiries) on a closed file is
220 undefined. Implementations may raise IOError in this case.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000221 """
222
Guido van Rossum141f7672007-04-10 00:22:16 +0000223 ### Internal ###
224
225 def _unsupported(self, name: str) -> IOError:
226 """Internal: raise an exception for unsupported operations."""
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000227 raise UnsupportedOperation("%s.%s() not supported" %
228 (self.__class__.__name__, name))
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000229
Guido van Rossum141f7672007-04-10 00:22:16 +0000230 ### Positioning ###
231
Guido van Rossum53807da2007-04-10 19:01:47 +0000232 def seek(self, pos: int, whence: int = 0) -> int:
233 """seek(pos: int, whence: int = 0) -> int. Change stream position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000234
235 Seek to byte offset pos relative to position indicated by whence:
236 0 Start of stream (the default). pos should be >= 0;
237 1 Current position - whence may be negative;
238 2 End of stream - whence usually negative.
Guido van Rossum53807da2007-04-10 19:01:47 +0000239 Returns the new absolute position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000240 """
241 self._unsupported("seek")
242
243 def tell(self) -> int:
244 """tell() -> int. Return current stream position."""
Guido van Rossum53807da2007-04-10 19:01:47 +0000245 return self.seek(0, 1)
Guido van Rossum141f7672007-04-10 00:22:16 +0000246
Guido van Rossum87429772007-04-10 21:06:59 +0000247 def truncate(self, pos: int = None) -> int:
248 """truncate(size: int = None) -> int. Truncate file to size bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000249
250 Size defaults to the current IO position as reported by tell().
Guido van Rossum87429772007-04-10 21:06:59 +0000251 Returns the new size.
Guido van Rossum141f7672007-04-10 00:22:16 +0000252 """
253 self._unsupported("truncate")
254
255 ### Flush and close ###
256
257 def flush(self) -> None:
258 """flush() -> None. Flushes write buffers, if applicable.
259
260 This is a no-op for read-only and non-blocking streams.
261 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000262 # XXX Should this return the number of bytes written???
Guido van Rossum141f7672007-04-10 00:22:16 +0000263
264 __closed = False
265
266 def close(self) -> None:
267 """close() -> None. Flushes and closes the IO object.
268
269 This must be idempotent. It should also set a flag for the
270 'closed' property (see below) to test.
271 """
272 if not self.__closed:
Guido van Rossum469734b2007-07-10 12:00:45 +0000273 try:
274 self.flush()
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000275 except IOError:
276 pass # If flush() fails, just give up
277 self.__closed = True
Guido van Rossum141f7672007-04-10 00:22:16 +0000278
279 def __del__(self) -> None:
280 """Destructor. Calls close()."""
281 # The try/except block is in case this is called at program
282 # exit time, when it's possible that globals have already been
283 # deleted, and then the close() call might fail. Since
284 # there's nothing we can do about such failures and they annoy
285 # the end users, we suppress the traceback.
286 try:
287 self.close()
288 except:
289 pass
290
291 ### Inquiries ###
292
293 def seekable(self) -> bool:
294 """seekable() -> bool. Return whether object supports random access.
295
296 If False, seek(), tell() and truncate() will raise IOError.
297 This method may need to do a test seek().
298 """
299 return False
300
Guido van Rossum5abbf752007-08-27 17:39:33 +0000301 def _checkSeekable(self, msg=None):
302 """Internal: raise an IOError if file is not seekable
303 """
304 if not self.seekable():
305 raise IOError("File or stream is not seekable."
306 if msg is None else msg)
307
308
Guido van Rossum141f7672007-04-10 00:22:16 +0000309 def readable(self) -> bool:
310 """readable() -> bool. Return whether object was opened for reading.
311
312 If False, read() will raise IOError.
313 """
314 return False
315
Guido van Rossum5abbf752007-08-27 17:39:33 +0000316 def _checkReadable(self, msg=None):
317 """Internal: raise an IOError if file is not readable
318 """
319 if not self.readable():
320 raise IOError("File or stream is not readable."
321 if msg is None else msg)
322
Guido van Rossum141f7672007-04-10 00:22:16 +0000323 def writable(self) -> bool:
324 """writable() -> bool. Return whether object was opened for writing.
325
326 If False, write() and truncate() will raise IOError.
327 """
328 return False
329
Guido van Rossum5abbf752007-08-27 17:39:33 +0000330 def _checkWritable(self, msg=None):
331 """Internal: raise an IOError if file is not writable
332 """
333 if not self.writable():
334 raise IOError("File or stream is not writable."
335 if msg is None else msg)
336
Guido van Rossum141f7672007-04-10 00:22:16 +0000337 @property
338 def closed(self):
339 """closed: bool. True iff the file has been closed.
340
341 For backwards compatibility, this is a property, not a predicate.
342 """
343 return self.__closed
344
Guido van Rossum5abbf752007-08-27 17:39:33 +0000345 def _checkClosed(self, msg=None):
346 """Internal: raise an ValueError if file is closed
347 """
348 if self.closed:
349 raise ValueError("I/O operation on closed file."
350 if msg is None else msg)
351
Guido van Rossum141f7672007-04-10 00:22:16 +0000352 ### Context manager ###
353
354 def __enter__(self) -> "IOBase": # That's a forward reference
355 """Context management protocol. Returns self."""
356 return self
357
358 def __exit__(self, *args) -> None:
359 """Context management protocol. Calls close()"""
360 self.close()
361
362 ### Lower-level APIs ###
363
364 # XXX Should these be present even if unimplemented?
365
366 def fileno(self) -> int:
367 """fileno() -> int. Returns underlying file descriptor if one exists.
368
369 Raises IOError if the IO object does not use a file descriptor.
370 """
371 self._unsupported("fileno")
372
373 def isatty(self) -> bool:
374 """isatty() -> int. Returns whether this is an 'interactive' stream.
375
376 Returns False if we don't know.
377 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000378 self._checkClosed()
Guido van Rossum141f7672007-04-10 00:22:16 +0000379 return False
380
Guido van Rossum7165cb12007-07-10 06:54:34 +0000381 ### Readline[s] and writelines ###
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000382
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000383 def readline(self, limit: int = -1) -> bytes:
384 """For backwards compatibility, a (slowish) readline()."""
Guido van Rossum2bf71382007-06-08 00:07:57 +0000385 if hasattr(self, "peek"):
386 def nreadahead():
387 readahead = self.peek(1, unsafe=True)
388 if not readahead:
389 return 1
390 n = (readahead.find(b"\n") + 1) or len(readahead)
391 if limit >= 0:
392 n = min(n, limit)
393 return n
394 else:
395 def nreadahead():
396 return 1
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000397 if limit is None:
398 limit = -1
Guido van Rossum254348e2007-11-21 19:29:53 +0000399 res = bytearray()
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000400 while limit < 0 or len(res) < limit:
Guido van Rossum2bf71382007-06-08 00:07:57 +0000401 b = self.read(nreadahead())
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000402 if not b:
403 break
404 res += b
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000405 if res.endswith(b"\n"):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000406 break
Guido van Rossum98297ee2007-11-06 21:34:58 +0000407 return bytes(res)
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000408
Guido van Rossum7165cb12007-07-10 06:54:34 +0000409 def __iter__(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000410 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000411 return self
412
413 def __next__(self):
414 line = self.readline()
415 if not line:
416 raise StopIteration
417 return line
418
419 def readlines(self, hint=None):
420 if hint is None:
421 return list(self)
422 n = 0
423 lines = []
424 for line in self:
425 lines.append(line)
426 n += len(line)
427 if n >= hint:
428 break
429 return lines
430
431 def writelines(self, lines):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000432 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000433 for line in lines:
434 self.write(line)
435
Guido van Rossum141f7672007-04-10 00:22:16 +0000436
437class RawIOBase(IOBase):
438
439 """Base class for raw binary I/O.
440
441 The read() method is implemented by calling readinto(); derived
442 classes that want to support read() only need to implement
443 readinto() as a primitive operation. In general, readinto()
444 can be more efficient than read().
445
446 (It would be tempting to also provide an implementation of
447 readinto() in terms of read(), in case the latter is a more
448 suitable primitive operation, but that would lead to nasty
449 recursion in case a subclass doesn't implement either.)
450 """
451
Guido van Rossum7165cb12007-07-10 06:54:34 +0000452 def read(self, n: int = -1) -> bytes:
Guido van Rossum78892e42007-04-06 17:31:18 +0000453 """read(n: int) -> bytes. Read and return up to n bytes.
Guido van Rossum01a27522007-03-07 01:00:12 +0000454
455 Returns an empty bytes array on EOF, or None if the object is
456 set not to block and has no data to read.
457 """
Guido van Rossum7165cb12007-07-10 06:54:34 +0000458 if n is None:
459 n = -1
460 if n < 0:
461 return self.readall()
Guido van Rossum254348e2007-11-21 19:29:53 +0000462 b = bytearray(n.__index__())
Guido van Rossum00efead2007-03-07 05:23:25 +0000463 n = self.readinto(b)
464 del b[n:]
Guido van Rossum98297ee2007-11-06 21:34:58 +0000465 return bytes(b)
Guido van Rossum28524c72007-02-27 05:47:44 +0000466
Guido van Rossum7165cb12007-07-10 06:54:34 +0000467 def readall(self):
468 """readall() -> bytes. Read until EOF, using multiple read() call."""
Guido van Rossum254348e2007-11-21 19:29:53 +0000469 res = bytearray()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000470 while True:
471 data = self.read(DEFAULT_BUFFER_SIZE)
472 if not data:
473 break
474 res += data
Guido van Rossum98297ee2007-11-06 21:34:58 +0000475 return bytes(res)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000476
Guido van Rossum141f7672007-04-10 00:22:16 +0000477 def readinto(self, b: bytes) -> int:
478 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
Guido van Rossum78892e42007-04-06 17:31:18 +0000479
480 Returns number of bytes read (0 for EOF), or None if the object
481 is set not to block as has no data to read.
482 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000483 self._unsupported("readinto")
Guido van Rossum28524c72007-02-27 05:47:44 +0000484
Guido van Rossum141f7672007-04-10 00:22:16 +0000485 def write(self, b: bytes) -> int:
Guido van Rossum78892e42007-04-06 17:31:18 +0000486 """write(b: bytes) -> int. Write the given buffer to the IO stream.
Guido van Rossum01a27522007-03-07 01:00:12 +0000487
Guido van Rossum78892e42007-04-06 17:31:18 +0000488 Returns the number of bytes written, which may be less than len(b).
Guido van Rossum01a27522007-03-07 01:00:12 +0000489 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000490 self._unsupported("write")
Guido van Rossum28524c72007-02-27 05:47:44 +0000491
Guido van Rossum78892e42007-04-06 17:31:18 +0000492
Guido van Rossum141f7672007-04-10 00:22:16 +0000493class FileIO(_fileio._FileIO, RawIOBase):
Guido van Rossum28524c72007-02-27 05:47:44 +0000494
Guido van Rossum141f7672007-04-10 00:22:16 +0000495 """Raw I/O implementation for OS files.
Guido van Rossum28524c72007-02-27 05:47:44 +0000496
Guido van Rossum141f7672007-04-10 00:22:16 +0000497 This multiply inherits from _FileIO and RawIOBase to make
498 isinstance(io.FileIO(), io.RawIOBase) return True without
499 requiring that _fileio._FileIO inherits from io.RawIOBase (which
500 would be hard to do since _fileio.c is written in C).
501 """
Guido van Rossuma9e20242007-03-08 00:43:48 +0000502
Guido van Rossum87429772007-04-10 21:06:59 +0000503 def close(self):
504 _fileio._FileIO.close(self)
505 RawIOBase.close(self)
506
Guido van Rossum13633bb2007-04-13 18:42:35 +0000507 @property
508 def name(self):
509 return self._name
510
511 @property
512 def mode(self):
513 return self._mode
514
Guido van Rossuma9e20242007-03-08 00:43:48 +0000515
Guido van Rossumcce92b22007-04-10 14:41:39 +0000516class BufferedIOBase(IOBase):
Guido van Rossum141f7672007-04-10 00:22:16 +0000517
518 """Base class for buffered IO objects.
519
520 The main difference with RawIOBase is that the read() method
521 supports omitting the size argument, and does not have a default
522 implementation that defers to readinto().
523
524 In addition, read(), readinto() and write() may raise
525 BlockingIOError if the underlying raw stream is in non-blocking
526 mode and not ready; unlike their raw counterparts, they will never
527 return None.
528
529 A typical implementation should not inherit from a RawIOBase
530 implementation, but wrap one.
531 """
532
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000533 def read(self, n: int = None) -> bytes:
534 """read(n: int = None) -> bytes. Read and return up to n bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000535
Guido van Rossum024da5c2007-05-17 23:59:11 +0000536 If the argument is omitted, None, or negative, reads and
537 returns all data until EOF.
Guido van Rossum141f7672007-04-10 00:22:16 +0000538
539 If the argument is positive, and the underlying raw stream is
540 not 'interactive', multiple raw reads may be issued to satisfy
541 the byte count (unless EOF is reached first). But for
542 interactive raw streams (XXX and for pipes?), at most one raw
543 read will be issued, and a short result does not imply that
544 EOF is imminent.
545
546 Returns an empty bytes array on EOF.
547
548 Raises BlockingIOError if the underlying raw stream has no
549 data at the moment.
550 """
551 self._unsupported("read")
552
553 def readinto(self, b: bytes) -> int:
554 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
555
556 Like read(), this may issue multiple reads to the underlying
557 raw stream, unless the latter is 'interactive' (XXX or a
558 pipe?).
559
560 Returns the number of bytes read (0 for EOF).
561
562 Raises BlockingIOError if the underlying raw stream has no
563 data at the moment.
564 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000565 # XXX This ought to work with anything that supports the buffer API
Guido van Rossum87429772007-04-10 21:06:59 +0000566 data = self.read(len(b))
567 n = len(data)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000568 try:
569 b[:n] = data
570 except TypeError as err:
571 import array
572 if not isinstance(b, array.array):
573 raise err
574 b[:n] = array.array('b', data)
Guido van Rossum87429772007-04-10 21:06:59 +0000575 return n
Guido van Rossum141f7672007-04-10 00:22:16 +0000576
577 def write(self, b: bytes) -> int:
578 """write(b: bytes) -> int. Write the given buffer to the IO stream.
579
580 Returns the number of bytes written, which is never less than
581 len(b).
582
583 Raises BlockingIOError if the buffer is full and the
584 underlying raw stream cannot accept more data at the moment.
585 """
586 self._unsupported("write")
587
588
589class _BufferedIOMixin(BufferedIOBase):
590
591 """A mixin implementation of BufferedIOBase with an underlying raw stream.
592
593 This passes most requests on to the underlying raw stream. It
594 does *not* provide implementations of read(), readinto() or
595 write().
596 """
597
598 def __init__(self, raw):
599 self.raw = raw
600
601 ### Positioning ###
602
603 def seek(self, pos, whence=0):
Guido van Rossum53807da2007-04-10 19:01:47 +0000604 return self.raw.seek(pos, whence)
Guido van Rossum141f7672007-04-10 00:22:16 +0000605
606 def tell(self):
607 return self.raw.tell()
608
609 def truncate(self, pos=None):
Guido van Rossum79b79ee2007-10-25 23:21:03 +0000610 # Flush the stream. We're mixing buffered I/O with lower-level I/O,
611 # and a flush may be necessary to synch both views of the current
612 # file state.
613 self.flush()
Guido van Rossum57233cb2007-10-26 17:19:33 +0000614
615 if pos is None:
616 pos = self.tell()
617 return self.raw.truncate(pos)
Guido van Rossum141f7672007-04-10 00:22:16 +0000618
619 ### Flush and close ###
620
621 def flush(self):
622 self.raw.flush()
623
624 def close(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000625 if not self.closed:
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000626 try:
627 self.flush()
628 except IOError:
629 pass # If flush() fails, just give up
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000630 self.raw.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000631
632 ### Inquiries ###
633
634 def seekable(self):
635 return self.raw.seekable()
636
637 def readable(self):
638 return self.raw.readable()
639
640 def writable(self):
641 return self.raw.writable()
642
643 @property
644 def closed(self):
645 return self.raw.closed
646
647 ### Lower-level APIs ###
648
649 def fileno(self):
650 return self.raw.fileno()
651
652 def isatty(self):
653 return self.raw.isatty()
654
655
Guido van Rossum024da5c2007-05-17 23:59:11 +0000656class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000657
Guido van Rossum024da5c2007-05-17 23:59:11 +0000658 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000659
Guido van Rossum024da5c2007-05-17 23:59:11 +0000660 # XXX More docs
661
662 def __init__(self, initial_bytes=None):
Guido van Rossum254348e2007-11-21 19:29:53 +0000663 buf = bytearray()
Guido van Rossum024da5c2007-05-17 23:59:11 +0000664 if initial_bytes is not None:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000665 buf += initial_bytes
666 self._buffer = buf
Guido van Rossum28524c72007-02-27 05:47:44 +0000667 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000668
669 def getvalue(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000670 return bytes(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000671
Guido van Rossum024da5c2007-05-17 23:59:11 +0000672 def read(self, n=None):
673 if n is None:
674 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000675 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000676 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000677 newpos = min(len(self._buffer), self._pos + n)
678 b = self._buffer[self._pos : newpos]
679 self._pos = newpos
Guido van Rossum98297ee2007-11-06 21:34:58 +0000680 return bytes(b)
Guido van Rossum28524c72007-02-27 05:47:44 +0000681
Guido van Rossum024da5c2007-05-17 23:59:11 +0000682 def read1(self, n):
683 return self.read(n)
684
Guido van Rossum28524c72007-02-27 05:47:44 +0000685 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000686 if self.closed:
687 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000688 if isinstance(b, str):
689 raise TypeError("can't write str to binary stream")
Guido van Rossum28524c72007-02-27 05:47:44 +0000690 n = len(b)
691 newpos = self._pos + n
Guido van Rossumb972a782007-07-21 00:25:15 +0000692 if newpos > len(self._buffer):
693 # Inserts null bytes between the current end of the file
694 # and the new write position.
Guido van Rossuma74184e2007-08-29 04:05:57 +0000695 padding = b'\x00' * (newpos - len(self._buffer) - n)
Guido van Rossumb972a782007-07-21 00:25:15 +0000696 self._buffer[self._pos:newpos - n] = padding
Guido van Rossum28524c72007-02-27 05:47:44 +0000697 self._buffer[self._pos:newpos] = b
698 self._pos = newpos
699 return n
700
701 def seek(self, pos, whence=0):
Christian Heimes3ab4f652007-11-09 01:27:29 +0000702 try:
703 pos = pos.__index__()
704 except AttributeError as err:
705 raise TypeError("an integer is required") from err
Guido van Rossum28524c72007-02-27 05:47:44 +0000706 if whence == 0:
707 self._pos = max(0, pos)
708 elif whence == 1:
709 self._pos = max(0, self._pos + pos)
710 elif whence == 2:
711 self._pos = max(0, len(self._buffer) + pos)
712 else:
713 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000714 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000715
716 def tell(self):
717 return self._pos
718
719 def truncate(self, pos=None):
720 if pos is None:
721 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000722 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000723 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000724
725 def readable(self):
726 return True
727
728 def writable(self):
729 return True
730
731 def seekable(self):
732 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000733
734
Guido van Rossum141f7672007-04-10 00:22:16 +0000735class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000736
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000737 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000738
Guido van Rossum78892e42007-04-06 17:31:18 +0000739 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000740 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000741 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000742 raw._checkReadable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000743 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000744 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000745 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000746
Guido van Rossum024da5c2007-05-17 23:59:11 +0000747 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000748 """Read n bytes.
749
750 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000751 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000752 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000753 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000754 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000755 if n is None:
756 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000757 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000758 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000759 to_read = max(self.buffer_size,
760 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000761 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000762 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000763 nodata_val = current
764 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000765 self._read_buf += current
766 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000767 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000768 n = len(self._read_buf)
769 out = self._read_buf[:n]
770 self._read_buf = self._read_buf[n:]
771 else:
772 out = nodata_val
773 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000774
Guido van Rossum13633bb2007-04-13 18:42:35 +0000775 def peek(self, n=0, *, unsafe=False):
776 """Returns buffered bytes without advancing the position.
777
778 The argument indicates a desired minimal number of bytes; we
779 do at most one raw read to satisfy it. We never return more
780 than self.buffer_size.
781
782 Unless unsafe=True is passed, we return a copy.
783 """
784 want = min(n, self.buffer_size)
785 have = len(self._read_buf)
786 if have < want:
787 to_read = self.buffer_size - have
788 current = self.raw.read(to_read)
789 if current:
790 self._read_buf += current
791 result = self._read_buf
792 if unsafe:
793 result = result[:]
794 return result
795
796 def read1(self, n):
797 """Reads up to n bytes.
798
799 Returns up to n bytes. If at least one byte is buffered,
800 we only return buffered bytes. Otherwise, we do one
801 raw read.
802 """
803 if n <= 0:
804 return b""
805 self.peek(1, unsafe=True)
806 return self.read(min(n, len(self._read_buf)))
807
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000808 def tell(self):
809 return self.raw.tell() - len(self._read_buf)
810
811 def seek(self, pos, whence=0):
812 if whence == 1:
813 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000814 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000815 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000816 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000817
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000818
Guido van Rossum141f7672007-04-10 00:22:16 +0000819class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000820
Guido van Rossum78892e42007-04-06 17:31:18 +0000821 # XXX docstring
822
Guido van Rossum141f7672007-04-10 00:22:16 +0000823 def __init__(self, raw,
824 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000825 raw._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000826 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000827 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000828 self.max_buffer_size = (2*buffer_size
829 if max_buffer_size is None
830 else max_buffer_size)
Guido van Rossum254348e2007-11-21 19:29:53 +0000831 self._write_buf = bytearray()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000832
833 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000834 if self.closed:
835 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000836 if isinstance(b, str):
837 raise TypeError("can't write str to binary stream")
Guido van Rossum01a27522007-03-07 01:00:12 +0000838 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000839 if len(self._write_buf) > self.buffer_size:
840 # We're full, so let's pre-flush the buffer
841 try:
842 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000843 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000844 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000845 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000846 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000847 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000848 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000849 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000850 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000851 try:
852 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000853 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000854 if (len(self._write_buf) > self.max_buffer_size):
855 # We've hit max_buffer_size. We have to accept a partial
856 # write and cut back our buffer.
857 overage = len(self._write_buf) - self.max_buffer_size
858 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000859 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000860 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000861
862 def flush(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000863 if self.closed:
864 raise ValueError("flush of closed file")
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000865 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000866 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000867 while self._write_buf:
868 n = self.raw.write(self._write_buf)
869 del self._write_buf[:n]
870 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000871 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000872 n = e.characters_written
873 del self._write_buf[:n]
874 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000875 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000876
877 def tell(self):
878 return self.raw.tell() + len(self._write_buf)
879
880 def seek(self, pos, whence=0):
881 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000882 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000883
Guido van Rossum01a27522007-03-07 01:00:12 +0000884
Guido van Rossum141f7672007-04-10 00:22:16 +0000885class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000886
Guido van Rossum01a27522007-03-07 01:00:12 +0000887 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000888
Guido van Rossum141f7672007-04-10 00:22:16 +0000889 A buffered reader object and buffered writer object put together
890 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000891
892 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000893
894 XXX The usefulness of this (compared to having two separate IO
895 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000896 """
897
Guido van Rossum141f7672007-04-10 00:22:16 +0000898 def __init__(self, reader, writer,
899 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
900 """Constructor.
901
902 The arguments are two RawIO instances.
903 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000904 reader._checkReadable()
905 writer._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000906 self.reader = BufferedReader(reader, buffer_size)
907 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000908
Guido van Rossum024da5c2007-05-17 23:59:11 +0000909 def read(self, n=None):
910 if n is None:
911 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000912 return self.reader.read(n)
913
Guido van Rossum141f7672007-04-10 00:22:16 +0000914 def readinto(self, b):
915 return self.reader.readinto(b)
916
Guido van Rossum01a27522007-03-07 01:00:12 +0000917 def write(self, b):
918 return self.writer.write(b)
919
Guido van Rossum13633bb2007-04-13 18:42:35 +0000920 def peek(self, n=0, *, unsafe=False):
921 return self.reader.peek(n, unsafe=unsafe)
922
923 def read1(self, n):
924 return self.reader.read1(n)
925
Guido van Rossum01a27522007-03-07 01:00:12 +0000926 def readable(self):
927 return self.reader.readable()
928
929 def writable(self):
930 return self.writer.writable()
931
932 def flush(self):
933 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000934
Guido van Rossum01a27522007-03-07 01:00:12 +0000935 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000936 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000937 self.reader.close()
938
939 def isatty(self):
940 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000941
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000942 @property
943 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000944 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000945
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000946
Guido van Rossum141f7672007-04-10 00:22:16 +0000947class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000948
Guido van Rossum78892e42007-04-06 17:31:18 +0000949 # XXX docstring
950
Guido van Rossum141f7672007-04-10 00:22:16 +0000951 def __init__(self, raw,
952 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000953 raw._checkSeekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000954 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000955 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
956
Guido van Rossum01a27522007-03-07 01:00:12 +0000957 def seek(self, pos, whence=0):
958 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000959 # First do the raw seek, then empty the read buffer, so that
960 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000961 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000962 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000963 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000964
965 def tell(self):
966 if (self._write_buf):
967 return self.raw.tell() + len(self._write_buf)
968 else:
969 return self.raw.tell() - len(self._read_buf)
970
Guido van Rossum024da5c2007-05-17 23:59:11 +0000971 def read(self, n=None):
972 if n is None:
973 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000974 self.flush()
975 return BufferedReader.read(self, n)
976
Guido van Rossum141f7672007-04-10 00:22:16 +0000977 def readinto(self, b):
978 self.flush()
979 return BufferedReader.readinto(self, b)
980
Guido van Rossum13633bb2007-04-13 18:42:35 +0000981 def peek(self, n=0, *, unsafe=False):
982 self.flush()
983 return BufferedReader.peek(self, n, unsafe=unsafe)
984
985 def read1(self, n):
986 self.flush()
987 return BufferedReader.read1(self, n)
988
Guido van Rossum01a27522007-03-07 01:00:12 +0000989 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +0000990 if self._read_buf:
991 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
992 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +0000993 return BufferedWriter.write(self, b)
994
Guido van Rossum78892e42007-04-06 17:31:18 +0000995
Guido van Rossumcce92b22007-04-10 14:41:39 +0000996class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +0000997
998 """Base class for text I/O.
999
1000 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +00001001
1002 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +00001003 """
1004
1005 def read(self, n: int = -1) -> str:
1006 """read(n: int = -1) -> str. Read at most n characters from stream.
1007
1008 Read from underlying buffer until we have n characters or we hit EOF.
1009 If n is negative or omitted, read until EOF.
1010 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001011 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +00001012
Guido van Rossum9b76da62007-04-11 01:09:03 +00001013 def write(self, s: str) -> int:
1014 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001015 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +00001016
Guido van Rossum9b76da62007-04-11 01:09:03 +00001017 def truncate(self, pos: int = None) -> int:
1018 """truncate(pos: int = None) -> int. Truncate size to pos."""
1019 self.flush()
1020 if pos is None:
1021 pos = self.tell()
1022 self.seek(pos)
1023 return self.buffer.truncate()
1024
Guido van Rossum78892e42007-04-06 17:31:18 +00001025 def readline(self) -> str:
1026 """readline() -> str. Read until newline or EOF.
1027
1028 Returns an empty string if EOF is hit immediately.
1029 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001030 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +00001031
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001032 @property
1033 def encoding(self):
1034 """Subclasses should override."""
1035 return None
1036
Guido van Rossum8358db22007-08-18 21:39:55 +00001037 @property
1038 def newlines(self):
1039 """newlines -> None | str | tuple of str. Line endings translated
1040 so far.
1041
1042 Only line endings translated during reading are considered.
1043
1044 Subclasses should override.
1045 """
1046 return None
1047
Guido van Rossum78892e42007-04-06 17:31:18 +00001048
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001049class IncrementalNewlineDecoder(codecs.IncrementalDecoder):
1050 """Codec used when reading a file in universal newlines mode.
1051 It wraps another incremental decoder, translating \\r\\n and \\r into \\n.
1052 It also records the types of newlines encountered.
1053 When used with translate=False, it ensures that the newline sequence is
1054 returned in one piece.
1055 """
1056 def __init__(self, decoder, translate, errors='strict'):
1057 codecs.IncrementalDecoder.__init__(self, errors=errors)
1058 self.buffer = b''
1059 self.translate = translate
1060 self.decoder = decoder
1061 self.seennl = 0
1062
1063 def decode(self, input, final=False):
1064 # decode input (with the eventual \r from a previous pass)
1065 if self.buffer:
1066 input = self.buffer + input
1067
1068 output = self.decoder.decode(input, final=final)
1069
1070 # retain last \r even when not translating data:
1071 # then readline() is sure to get \r\n in one pass
1072 if output.endswith("\r") and not final:
1073 output = output[:-1]
1074 self.buffer = b'\r'
1075 else:
1076 self.buffer = b''
1077
1078 # Record which newlines are read
1079 crlf = output.count('\r\n')
1080 cr = output.count('\r') - crlf
1081 lf = output.count('\n') - crlf
1082 self.seennl |= (lf and self._LF) | (cr and self._CR) \
1083 | (crlf and self._CRLF)
1084
1085 if self.translate:
1086 if crlf:
1087 output = output.replace("\r\n", "\n")
1088 if cr:
1089 output = output.replace("\r", "\n")
1090
1091 return output
1092
1093 def getstate(self):
1094 buf, flag = self.decoder.getstate()
1095 return buf + self.buffer, flag
1096
1097 def setstate(self, state):
1098 buf, flag = state
1099 if buf.endswith(b'\r'):
1100 self.buffer = b'\r'
1101 buf = buf[:-1]
1102 else:
1103 self.buffer = b''
1104 self.decoder.setstate((buf, flag))
1105
1106 def reset(self):
1107 self.buffer = b''
1108 self.decoder.reset()
1109
1110 _LF = 1
1111 _CR = 2
1112 _CRLF = 4
1113
1114 @property
1115 def newlines(self):
1116 return (None,
1117 "\n",
1118 "\r",
1119 ("\r", "\n"),
1120 "\r\n",
1121 ("\n", "\r\n"),
1122 ("\r", "\r\n"),
1123 ("\r", "\n", "\r\n")
1124 )[self.seennl]
1125
1126
Guido van Rossum78892e42007-04-06 17:31:18 +00001127class TextIOWrapper(TextIOBase):
1128
1129 """Buffered text stream.
1130
1131 Character and line based layer over a BufferedIOBase object.
1132 """
1133
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001134 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +00001135
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001136 def __init__(self, buffer, encoding=None, errors=None, newline=None):
Guido van Rossum8358db22007-08-18 21:39:55 +00001137 if newline not in (None, "", "\n", "\r", "\r\n"):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001138 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +00001139 if encoding is None:
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001140 try:
1141 encoding = os.device_encoding(buffer.fileno())
Brett Cannon041683d2007-10-11 23:08:53 +00001142 except (AttributeError, UnsupportedOperation):
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001143 pass
1144 if encoding is None:
Martin v. Löwisd78d3b42007-08-11 15:36:45 +00001145 try:
1146 import locale
1147 except ImportError:
1148 # Importing locale may fail if Python is being built
1149 encoding = "ascii"
1150 else:
1151 encoding = locale.getpreferredencoding()
Guido van Rossum78892e42007-04-06 17:31:18 +00001152
Christian Heimes8bd14fb2007-11-08 16:34:32 +00001153 if not isinstance(encoding, str):
1154 raise ValueError("invalid encoding: %r" % encoding)
1155
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001156 if errors is None:
1157 errors = "strict"
1158 else:
1159 if not isinstance(errors, str):
1160 raise ValueError("invalid errors: %r" % errors)
1161
Guido van Rossum78892e42007-04-06 17:31:18 +00001162 self.buffer = buffer
1163 self._encoding = encoding
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001164 self._errors = errors
Guido van Rossum8358db22007-08-18 21:39:55 +00001165 self._readuniversal = not newline
1166 self._readtranslate = newline is None
1167 self._readnl = newline
1168 self._writetranslate = newline != ''
1169 self._writenl = newline or os.linesep
Guido van Rossum78892e42007-04-06 17:31:18 +00001170 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +00001171 self._pending = ""
1172 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001173 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001174
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001175 @property
1176 def encoding(self):
1177 return self._encoding
1178
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001179 @property
1180 def errors(self):
1181 return self._errors
1182
Guido van Rossum9b76da62007-04-11 01:09:03 +00001183 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001184 # tuple (decoder_state, readahead, pending) where decoder_state is
1185 # the second (integer) item of the decoder state, readahead is the
1186 # chunk of bytes that was read, and pending is the characters that
1187 # were rendered by the decoder after feeding it those bytes. We
1188 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001189
1190 def _seekable(self):
1191 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001192
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001193 def flush(self):
1194 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001195 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001196
1197 def close(self):
Guido van Rossum33e7a8e2007-07-22 20:38:07 +00001198 try:
1199 self.flush()
1200 except:
1201 pass # If flush() fails, just give up
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001202 self.buffer.close()
1203
1204 @property
1205 def closed(self):
1206 return self.buffer.closed
1207
Guido van Rossum9be55972007-04-07 02:59:27 +00001208 def fileno(self):
1209 return self.buffer.fileno()
1210
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001211 def isatty(self):
1212 return self.buffer.isatty()
1213
Guido van Rossum78892e42007-04-06 17:31:18 +00001214 def write(self, s: str):
Guido van Rossum4b5386f2007-07-10 09:12:49 +00001215 if self.closed:
1216 raise ValueError("write to closed file")
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001217 if not isinstance(s, str):
Guido van Rossumdcce8392007-08-29 18:10:08 +00001218 raise TypeError("can't write %s to text stream" %
1219 s.__class__.__name__)
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001220 length = len(s)
Guido van Rossum8358db22007-08-18 21:39:55 +00001221 haslf = "\n" in s
1222 if haslf and self._writetranslate and self._writenl != "\n":
1223 s = s.replace("\n", self._writenl)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001224 # XXX What if we were just reading?
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001225 b = s.encode(self._encoding, self._errors)
Guido van Rossum8358db22007-08-18 21:39:55 +00001226 self.buffer.write(b)
1227 if haslf and self.isatty():
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001228 self.flush()
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001229 self._snapshot = None
1230 if self._decoder:
1231 self._decoder.reset()
1232 return length
Guido van Rossum78892e42007-04-06 17:31:18 +00001233
1234 def _get_decoder(self):
1235 make_decoder = codecs.getincrementaldecoder(self._encoding)
1236 if make_decoder is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001237 raise IOError("Can't find an incremental decoder for encoding %s" %
Guido van Rossum78892e42007-04-06 17:31:18 +00001238 self._encoding)
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001239 decoder = make_decoder(self._errors)
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001240 if self._readuniversal:
1241 decoder = IncrementalNewlineDecoder(decoder, self._readtranslate)
1242 self._decoder = decoder
Guido van Rossum78892e42007-04-06 17:31:18 +00001243 return decoder
1244
Guido van Rossum9b76da62007-04-11 01:09:03 +00001245 def _read_chunk(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +00001246 if self._decoder is None:
1247 raise ValueError("no decoder")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001248 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001249 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001250 pending = self._decoder.decode(readahead, not readahead)
1251 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001252 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001253 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001254 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001255 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001256 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001257
1258 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001259 x = 0
1260 for i in bytes(ds):
1261 x = x<<8 | i
1262 return (x<<64) | pos
1263
1264 def _decode_decoder_state(self, pos):
1265 x, pos = divmod(pos, 1<<64)
1266 if not x:
1267 return None, pos
1268 b = b""
1269 while x:
1270 b.append(x&0xff)
1271 x >>= 8
1272 return str(b[::-1]), pos
1273
1274 def tell(self):
1275 if not self._seekable:
1276 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001277 if not self._telling:
1278 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001279 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001280 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001281 decoder = self._decoder
1282 if decoder is None or self._snapshot is None:
Guido van Rossum5abbf752007-08-27 17:39:33 +00001283 if self._pending:
1284 raise ValueError("pending data")
Guido van Rossumcba608c2007-04-11 14:19:59 +00001285 return position
1286 decoder_state, readahead, pending = self._snapshot
1287 position -= len(readahead)
1288 needed = len(pending) - len(self._pending)
1289 if not needed:
1290 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001291 saved_state = decoder.getstate()
1292 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001293 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001294 n = 0
Guido van Rossum254348e2007-11-21 19:29:53 +00001295 bb = bytearray(1)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001296 for i, bb[0] in enumerate(readahead):
1297 n += len(decoder.decode(bb))
1298 if n >= needed:
1299 decoder_buffer, decoder_state = decoder.getstate()
1300 return self._encode_decoder_state(
1301 decoder_state,
Amaury Forgeot d'Arca2d1d7e2007-11-19 21:14:47 +00001302 position + (i+1) - len(decoder_buffer) - (n - needed))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001303 raise IOError("Can't reconstruct logical file position")
1304 finally:
1305 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001306
1307 def seek(self, pos, whence=0):
1308 if not self._seekable:
1309 raise IOError("Underlying stream is not seekable")
1310 if whence == 1:
1311 if pos != 0:
1312 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001313 pos = self.tell()
1314 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001315 if whence == 2:
1316 if pos != 0:
1317 raise IOError("Can't do nonzero end-relative seeks")
1318 self.flush()
1319 pos = self.buffer.seek(0, 2)
1320 self._snapshot = None
1321 self._pending = ""
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001322 if self._decoder:
1323 self._decoder.reset()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001324 return pos
1325 if whence != 0:
1326 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1327 (whence,))
1328 if pos < 0:
1329 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001330 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001331 orig_pos = pos
1332 ds, pos = self._decode_decoder_state(pos)
1333 if not ds:
1334 self.buffer.seek(pos)
1335 self._snapshot = None
1336 self._pending = ""
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001337 if self._decoder:
1338 self._decoder.reset()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001339 return pos
Guido van Rossumd76e7792007-04-17 02:38:04 +00001340 decoder = self._decoder or self._get_decoder()
1341 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001342 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001343 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001344 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001345 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001346 return orig_pos
1347
Guido van Rossum024da5c2007-05-17 23:59:11 +00001348 def read(self, n=None):
1349 if n is None:
1350 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001351 decoder = self._decoder or self._get_decoder()
1352 res = self._pending
1353 if n < 0:
1354 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001355 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001356 self._snapshot = None
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001357 return res
Guido van Rossum78892e42007-04-06 17:31:18 +00001358 else:
1359 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001360 readahead, pending = self._read_chunk()
1361 res += pending
1362 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001363 break
1364 self._pending = res[n:]
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001365 return res[:n]
Guido van Rossum78892e42007-04-06 17:31:18 +00001366
Guido van Rossum024da5c2007-05-17 23:59:11 +00001367 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001368 self._telling = False
1369 line = self.readline()
1370 if not line:
1371 self._snapshot = None
1372 self._telling = self._seekable
1373 raise StopIteration
1374 return line
1375
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001376 def readline(self, limit=None):
Guido van Rossum98297ee2007-11-06 21:34:58 +00001377 if limit is None:
1378 limit = -1
1379 if limit >= 0:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001380 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001381 line = self.readline()
1382 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001383 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001384 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001385 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001386
Guido van Rossum78892e42007-04-06 17:31:18 +00001387 line = self._pending
1388 start = 0
1389 decoder = self._decoder or self._get_decoder()
1390
Guido van Rossum8358db22007-08-18 21:39:55 +00001391 pos = endpos = None
Guido van Rossum78892e42007-04-06 17:31:18 +00001392 while True:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001393 if self._readtranslate:
1394 # Newlines are already translated, only search for \n
1395 pos = line.find('\n', start)
1396 if pos >= 0:
1397 endpos = pos + 1
1398 break
1399 else:
1400 start = len(line)
1401
1402 elif self._readuniversal:
Guido van Rossum8358db22007-08-18 21:39:55 +00001403 # Universal newline search. Find any of \r, \r\n, \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001404 # The decoder ensures that \r\n are not split in two pieces
Guido van Rossum78892e42007-04-06 17:31:18 +00001405
Guido van Rossum8358db22007-08-18 21:39:55 +00001406 # In C we'd look for these in parallel of course.
1407 nlpos = line.find("\n", start)
1408 crpos = line.find("\r", start)
1409 if crpos == -1:
1410 if nlpos == -1:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001411 # Nothing found
Guido van Rossum8358db22007-08-18 21:39:55 +00001412 start = len(line)
Guido van Rossum78892e42007-04-06 17:31:18 +00001413 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001414 # Found \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001415 endpos = nlpos + 1
Guido van Rossum8358db22007-08-18 21:39:55 +00001416 break
1417 elif nlpos == -1:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001418 # Found lone \r
1419 endpos = crpos + 1
1420 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001421 elif nlpos < crpos:
1422 # Found \n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001423 endpos = nlpos + 1
Guido van Rossum78892e42007-04-06 17:31:18 +00001424 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001425 elif nlpos == crpos + 1:
1426 # Found \r\n
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001427 endpos = crpos + 2
Guido van Rossum8358db22007-08-18 21:39:55 +00001428 break
1429 else:
1430 # Found \r
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001431 endpos = crpos + 1
Guido van Rossum8358db22007-08-18 21:39:55 +00001432 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001433 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001434 # non-universal
1435 pos = line.find(self._readnl)
1436 if pos >= 0:
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001437 endpos = pos + len(self._readnl)
Guido van Rossum8358db22007-08-18 21:39:55 +00001438 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001439
1440 # No line ending seen yet - get more data
Guido van Rossum8358db22007-08-18 21:39:55 +00001441 more_line = ''
Guido van Rossum78892e42007-04-06 17:31:18 +00001442 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001443 readahead, pending = self._read_chunk()
1444 more_line = pending
1445 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001446 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001447 if more_line:
1448 line += more_line
1449 else:
1450 # end of file
1451 self._pending = ''
1452 self._snapshot = None
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001453 return line
Guido van Rossum78892e42007-04-06 17:31:18 +00001454
Guido van Rossum8358db22007-08-18 21:39:55 +00001455 self._pending = line[endpos:]
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001456 return line[:endpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001457
Guido van Rossum8358db22007-08-18 21:39:55 +00001458 @property
1459 def newlines(self):
Amaury Forgeot d'Arc1ff99102007-11-19 20:34:10 +00001460 return self._decoder.newlines if self._decoder else None
Guido van Rossum024da5c2007-05-17 23:59:11 +00001461
1462class StringIO(TextIOWrapper):
1463
1464 # XXX This is really slow, but fully functional
1465
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001466 def __init__(self, initial_value="", encoding="utf-8",
1467 errors="strict", newline="\n"):
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001468 super(StringIO, self).__init__(BytesIO(),
1469 encoding=encoding,
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001470 errors=errors,
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001471 newline=newline)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001472 if initial_value:
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001473 if not isinstance(initial_value, str):
Guido van Rossum34d19282007-08-09 01:03:29 +00001474 initial_value = str(initial_value)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001475 self.write(initial_value)
1476 self.seek(0)
1477
1478 def getvalue(self):
Guido van Rossum34d19282007-08-09 01:03:29 +00001479 self.flush()
Guido van Rossume7fc50f2007-12-03 22:54:21 +00001480 return self.buffer.getvalue().decode(self._encoding, self._errors)