blob: a7cdd1f14724d041908decb69840caaeae94b150 [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 default buffer size to 1 if isatty()
16XXX need to support 1 meaning line-buffered
Guido van Rossum76c5d4d2007-04-06 19:10:29 +000017XXX don't use assert to validate input requirements
Guido van Rossum9b76da62007-04-11 01:09:03 +000018XXX whenever an argument is None, use the default value
19XXX read/write ops should check readable/writable
Guido van Rossumd4103952007-04-12 05:44:49 +000020XXX buffered readinto should work with arbitrary buffer objects
Guido van Rossumd76e7792007-04-17 02:38:04 +000021XXX use incremental encoder for text output, at least for UTF-16 and UTF-8-SIG
Guido van Rossum28524c72007-02-27 05:47:44 +000022"""
23
Guido van Rossum68bbcd22007-02-27 17:19:33 +000024__author__ = ("Guido van Rossum <guido@python.org>, "
Guido van Rossum78892e42007-04-06 17:31:18 +000025 "Mike Verdone <mike.verdone@gmail.com>, "
26 "Mark Russell <mark.russell@zen.co.uk>")
Guido van Rossum28524c72007-02-27 05:47:44 +000027
Guido van Rossum141f7672007-04-10 00:22:16 +000028__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO",
29 "SocketIO", "BytesIO", "StringIO", "BufferedIOBase",
Guido van Rossum01a27522007-03-07 01:00:12 +000030 "BufferedReader", "BufferedWriter", "BufferedRWPair",
Guido van Rossum141f7672007-04-10 00:22:16 +000031 "BufferedRandom", "TextIOBase", "TextIOWrapper"]
Guido van Rossum28524c72007-02-27 05:47:44 +000032
33import os
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 Rossum9b76da62007-04-11 01:09:03 +000039# XXX Shouldn't we use st_blksize whenever we can?
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000040DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
Guido van Rossum01a27522007-03-07 01:00:12 +000041
42
Guido van Rossum141f7672007-04-10 00:22:16 +000043class BlockingIOError(IOError):
Guido van Rossum78892e42007-04-06 17:31:18 +000044
Guido van Rossum141f7672007-04-10 00:22:16 +000045 """Exception raised when I/O would block on a non-blocking I/O stream."""
46
47 def __init__(self, errno, strerror, characters_written=0):
Guido van Rossum01a27522007-03-07 01:00:12 +000048 IOError.__init__(self, errno, strerror)
49 self.characters_written = characters_written
50
Guido van Rossum68bbcd22007-02-27 17:19:33 +000051
Guido van Rossum9cbfffd2007-06-07 00:54:15 +000052def open(file, mode="r", buffering=None, encoding=None, newline=None):
Guido van Rossum17e43e52007-02-27 15:45:13 +000053 """Replacement for the built-in open function.
54
55 Args:
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000056 file: string giving the name of the file to be opened;
Guido van Rossum9b76da62007-04-11 01:09:03 +000057 or integer file descriptor of the file to be wrapped (*).
58 mode: optional mode string; see below.
Guido van Rossum17e43e52007-02-27 15:45:13 +000059 buffering: optional int >= 0 giving the buffer size; values
60 can be: 0 = unbuffered, 1 = line buffered,
Guido van Rossum9b76da62007-04-11 01:09:03 +000061 larger = fully buffered.
Guido van Rossum9b76da62007-04-11 01:09:03 +000062 encoding: optional string giving the text encoding.
63 newline: optional newlines specifier; must be None, '\n' or '\r\n';
64 specifies the line ending expected on input and written on
65 output. If None, use universal newlines on input and
66 use os.linesep on output.
Guido van Rossum17e43e52007-02-27 15:45:13 +000067
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000068 (*) If a file descriptor is given, it is closed when the returned
69 I/O object is closed. If you don't want this to happen, use
70 os.dup() to create a duplicate file descriptor.
71
Guido van Rossum17e43e52007-02-27 15:45:13 +000072 Mode strings characters:
73 'r': open for reading (default)
74 'w': open for writing, truncating the file first
75 'a': open for writing, appending to the end if the file exists
76 'b': binary mode
77 't': text mode (default)
78 '+': open a disk file for updating (implies reading and writing)
Guido van Rossum9be55972007-04-07 02:59:27 +000079 'U': universal newline mode (for backwards compatibility)
Guido van Rossum17e43e52007-02-27 15:45:13 +000080
81 Constraints:
82 - encoding must not be given when a binary mode is given
83 - buffering must not be zero when a text mode is given
84
85 Returns:
86 Depending on the mode and buffering arguments, either a raw
87 binary stream, a buffered binary stream, or a buffered text
88 stream, open for reading and/or writing.
89 """
Guido van Rossum9b76da62007-04-11 01:09:03 +000090 # XXX Don't use asserts for these checks; raise TypeError or ValueError
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000091 assert isinstance(file, (basestring, int)), repr(file)
92 assert isinstance(mode, basestring), repr(mode)
93 assert buffering is None or isinstance(buffering, int), repr(buffering)
94 assert encoding is None or isinstance(encoding, basestring), repr(encoding)
Guido van Rossum28524c72007-02-27 05:47:44 +000095 modes = set(mode)
Guido van Rossum9be55972007-04-07 02:59:27 +000096 if modes - set("arwb+tU") or len(mode) > len(modes):
Guido van Rossum28524c72007-02-27 05:47:44 +000097 raise ValueError("invalid mode: %r" % mode)
98 reading = "r" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +000099 writing = "w" in modes
Guido van Rossum28524c72007-02-27 05:47:44 +0000100 appending = "a" in modes
101 updating = "+" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000102 text = "t" in modes
103 binary = "b" in modes
Guido van Rossum7165cb12007-07-10 06:54:34 +0000104 if "U" in modes:
105 if writing or appending:
106 raise ValueError("can't use U and writing mode at once")
Guido van Rossum9be55972007-04-07 02:59:27 +0000107 reading = True
Guido van Rossum28524c72007-02-27 05:47:44 +0000108 if text and binary:
109 raise ValueError("can't have text and binary mode at once")
110 if reading + writing + appending > 1:
111 raise ValueError("can't have read/write/append mode at once")
112 if not (reading or writing or appending):
113 raise ValueError("must have exactly one of read/write/append mode")
114 if binary and encoding is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +0000115 raise ValueError("binary mode doesn't take an encoding argument")
116 if binary and newline is not None:
117 raise ValueError("binary mode doesn't take a newline argument")
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000118 raw = FileIO(file,
Guido van Rossum28524c72007-02-27 05:47:44 +0000119 (reading and "r" or "") +
120 (writing and "w" or "") +
121 (appending and "a" or "") +
122 (updating and "+" or ""))
123 if buffering is None:
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000124 buffering = -1
125 if buffering < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000126 buffering = DEFAULT_BUFFER_SIZE
127 # XXX Should default to line buffering if os.isatty(raw.fileno())
Guido van Rossum17e43e52007-02-27 15:45:13 +0000128 try:
129 bs = os.fstat(raw.fileno()).st_blksize
130 except (os.error, AttributeError):
Guido van Rossumbb09b212007-03-18 03:36:28 +0000131 pass
132 else:
Guido van Rossum17e43e52007-02-27 15:45:13 +0000133 if bs > 1:
134 buffering = bs
Guido van Rossum28524c72007-02-27 05:47:44 +0000135 if buffering < 0:
136 raise ValueError("invalid buffering size")
137 if buffering == 0:
138 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000139 raw._name = file
140 raw._mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000141 return raw
142 raise ValueError("can't have unbuffered text I/O")
143 if updating:
144 buffer = BufferedRandom(raw, buffering)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000145 elif writing or appending:
Guido van Rossum28524c72007-02-27 05:47:44 +0000146 buffer = BufferedWriter(raw, buffering)
147 else:
148 assert reading
149 buffer = BufferedReader(raw, buffering)
150 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000151 buffer.name = file
152 buffer.mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000153 return buffer
Guido van Rossum13633bb2007-04-13 18:42:35 +0000154 text = TextIOWrapper(buffer, encoding, newline)
155 text.name = file
156 text.mode = mode
157 return text
Guido van Rossum28524c72007-02-27 05:47:44 +0000158
159
Guido van Rossum141f7672007-04-10 00:22:16 +0000160class IOBase:
Guido van Rossum28524c72007-02-27 05:47:44 +0000161
Guido van Rossum141f7672007-04-10 00:22:16 +0000162 """Base class for all I/O classes.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000163
Guido van Rossum141f7672007-04-10 00:22:16 +0000164 This class provides dummy implementations for many methods that
Guido van Rossum17e43e52007-02-27 15:45:13 +0000165 derived classes can override selectively; the default
166 implementations represent a file that cannot be read, written or
167 seeked.
168
Guido van Rossum141f7672007-04-10 00:22:16 +0000169 This does not define read(), readinto() and write(), nor
170 readline() and friends, since their signatures vary per layer.
Guido van Rossum53807da2007-04-10 19:01:47 +0000171
172 Not that calling any method (even inquiries) on a closed file is
173 undefined. Implementations may raise IOError in this case.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000174 """
175
Guido van Rossum141f7672007-04-10 00:22:16 +0000176 ### Internal ###
177
178 def _unsupported(self, name: str) -> IOError:
179 """Internal: raise an exception for unsupported operations."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000180 raise IOError("%s.%s() not supported" % (self.__class__.__name__,
181 name))
182
Guido van Rossum141f7672007-04-10 00:22:16 +0000183 ### Positioning ###
184
Guido van Rossum53807da2007-04-10 19:01:47 +0000185 def seek(self, pos: int, whence: int = 0) -> int:
186 """seek(pos: int, whence: int = 0) -> int. Change stream position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000187
188 Seek to byte offset pos relative to position indicated by whence:
189 0 Start of stream (the default). pos should be >= 0;
190 1 Current position - whence may be negative;
191 2 End of stream - whence usually negative.
Guido van Rossum53807da2007-04-10 19:01:47 +0000192 Returns the new absolute position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000193 """
194 self._unsupported("seek")
195
196 def tell(self) -> int:
197 """tell() -> int. Return current stream position."""
Guido van Rossum53807da2007-04-10 19:01:47 +0000198 return self.seek(0, 1)
Guido van Rossum141f7672007-04-10 00:22:16 +0000199
Guido van Rossum87429772007-04-10 21:06:59 +0000200 def truncate(self, pos: int = None) -> int:
201 """truncate(size: int = None) -> int. Truncate file to size bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000202
203 Size defaults to the current IO position as reported by tell().
Guido van Rossum87429772007-04-10 21:06:59 +0000204 Returns the new size.
Guido van Rossum141f7672007-04-10 00:22:16 +0000205 """
206 self._unsupported("truncate")
207
208 ### Flush and close ###
209
210 def flush(self) -> None:
211 """flush() -> None. Flushes write buffers, if applicable.
212
213 This is a no-op for read-only and non-blocking streams.
214 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000215 # XXX Should this return the number of bytes written???
Guido van Rossum141f7672007-04-10 00:22:16 +0000216
217 __closed = False
218
219 def close(self) -> None:
220 """close() -> None. Flushes and closes the IO object.
221
222 This must be idempotent. It should also set a flag for the
223 'closed' property (see below) to test.
224 """
225 if not self.__closed:
226 self.__closed = True
227 self.flush()
228
229 def __del__(self) -> None:
230 """Destructor. Calls close()."""
231 # The try/except block is in case this is called at program
232 # exit time, when it's possible that globals have already been
233 # deleted, and then the close() call might fail. Since
234 # there's nothing we can do about such failures and they annoy
235 # the end users, we suppress the traceback.
236 try:
237 self.close()
238 except:
239 pass
240
241 ### Inquiries ###
242
243 def seekable(self) -> bool:
244 """seekable() -> bool. Return whether object supports random access.
245
246 If False, seek(), tell() and truncate() will raise IOError.
247 This method may need to do a test seek().
248 """
249 return False
250
251 def readable(self) -> bool:
252 """readable() -> bool. Return whether object was opened for reading.
253
254 If False, read() will raise IOError.
255 """
256 return False
257
258 def writable(self) -> bool:
259 """writable() -> bool. Return whether object was opened for writing.
260
261 If False, write() and truncate() will raise IOError.
262 """
263 return False
264
265 @property
266 def closed(self):
267 """closed: bool. True iff the file has been closed.
268
269 For backwards compatibility, this is a property, not a predicate.
270 """
271 return self.__closed
272
273 ### Context manager ###
274
275 def __enter__(self) -> "IOBase": # That's a forward reference
276 """Context management protocol. Returns self."""
277 return self
278
279 def __exit__(self, *args) -> None:
280 """Context management protocol. Calls close()"""
281 self.close()
282
283 ### Lower-level APIs ###
284
285 # XXX Should these be present even if unimplemented?
286
287 def fileno(self) -> int:
288 """fileno() -> int. Returns underlying file descriptor if one exists.
289
290 Raises IOError if the IO object does not use a file descriptor.
291 """
292 self._unsupported("fileno")
293
294 def isatty(self) -> bool:
295 """isatty() -> int. Returns whether this is an 'interactive' stream.
296
297 Returns False if we don't know.
298 """
299 return False
300
Guido van Rossum7165cb12007-07-10 06:54:34 +0000301 ### Readline[s] and writelines ###
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000302
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000303 def readline(self, limit: int = -1) -> bytes:
304 """For backwards compatibility, a (slowish) readline()."""
Guido van Rossum2bf71382007-06-08 00:07:57 +0000305 if hasattr(self, "peek"):
306 def nreadahead():
307 readahead = self.peek(1, unsafe=True)
308 if not readahead:
309 return 1
310 n = (readahead.find(b"\n") + 1) or len(readahead)
311 if limit >= 0:
312 n = min(n, limit)
313 return n
314 else:
315 def nreadahead():
316 return 1
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000317 if limit is None:
318 limit = -1
319 res = bytes()
320 while limit < 0 or len(res) < limit:
Guido van Rossum2bf71382007-06-08 00:07:57 +0000321 b = self.read(nreadahead())
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000322 if not b:
323 break
324 res += b
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000325 if res.endswith(b"\n"):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000326 break
327 return res
328
Guido van Rossum7165cb12007-07-10 06:54:34 +0000329 def __iter__(self):
330 return self
331
332 def __next__(self):
333 line = self.readline()
334 if not line:
335 raise StopIteration
336 return line
337
338 def readlines(self, hint=None):
339 if hint is None:
340 return list(self)
341 n = 0
342 lines = []
343 for line in self:
344 lines.append(line)
345 n += len(line)
346 if n >= hint:
347 break
348 return lines
349
350 def writelines(self, lines):
351 for line in lines:
352 self.write(line)
353
Guido van Rossum141f7672007-04-10 00:22:16 +0000354
355class RawIOBase(IOBase):
356
357 """Base class for raw binary I/O.
358
359 The read() method is implemented by calling readinto(); derived
360 classes that want to support read() only need to implement
361 readinto() as a primitive operation. In general, readinto()
362 can be more efficient than read().
363
364 (It would be tempting to also provide an implementation of
365 readinto() in terms of read(), in case the latter is a more
366 suitable primitive operation, but that would lead to nasty
367 recursion in case a subclass doesn't implement either.)
368 """
369
Guido van Rossum7165cb12007-07-10 06:54:34 +0000370 def read(self, n: int = -1) -> bytes:
Guido van Rossum78892e42007-04-06 17:31:18 +0000371 """read(n: int) -> bytes. Read and return up to n bytes.
Guido van Rossum01a27522007-03-07 01:00:12 +0000372
373 Returns an empty bytes array on EOF, or None if the object is
374 set not to block and has no data to read.
375 """
Guido van Rossum7165cb12007-07-10 06:54:34 +0000376 if n is None:
377 n = -1
378 if n < 0:
379 return self.readall()
Guido van Rossum28524c72007-02-27 05:47:44 +0000380 b = bytes(n.__index__())
Guido van Rossum00efead2007-03-07 05:23:25 +0000381 n = self.readinto(b)
382 del b[n:]
Guido van Rossum28524c72007-02-27 05:47:44 +0000383 return b
384
Guido van Rossum7165cb12007-07-10 06:54:34 +0000385 def readall(self):
386 """readall() -> bytes. Read until EOF, using multiple read() call."""
387 res = bytes()
388 while True:
389 data = self.read(DEFAULT_BUFFER_SIZE)
390 if not data:
391 break
392 res += data
393 return res
394
Guido van Rossum141f7672007-04-10 00:22:16 +0000395 def readinto(self, b: bytes) -> int:
396 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
Guido van Rossum78892e42007-04-06 17:31:18 +0000397
398 Returns number of bytes read (0 for EOF), or None if the object
399 is set not to block as has no data to read.
400 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000401 self._unsupported("readinto")
Guido van Rossum28524c72007-02-27 05:47:44 +0000402
Guido van Rossum141f7672007-04-10 00:22:16 +0000403 def write(self, b: bytes) -> int:
Guido van Rossum78892e42007-04-06 17:31:18 +0000404 """write(b: bytes) -> int. Write the given buffer to the IO stream.
Guido van Rossum01a27522007-03-07 01:00:12 +0000405
Guido van Rossum78892e42007-04-06 17:31:18 +0000406 Returns the number of bytes written, which may be less than len(b).
Guido van Rossum01a27522007-03-07 01:00:12 +0000407 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000408 self._unsupported("write")
Guido van Rossum28524c72007-02-27 05:47:44 +0000409
Guido van Rossum78892e42007-04-06 17:31:18 +0000410
Guido van Rossum141f7672007-04-10 00:22:16 +0000411class FileIO(_fileio._FileIO, RawIOBase):
Guido van Rossum28524c72007-02-27 05:47:44 +0000412
Guido van Rossum141f7672007-04-10 00:22:16 +0000413 """Raw I/O implementation for OS files.
Guido van Rossum28524c72007-02-27 05:47:44 +0000414
Guido van Rossum141f7672007-04-10 00:22:16 +0000415 This multiply inherits from _FileIO and RawIOBase to make
416 isinstance(io.FileIO(), io.RawIOBase) return True without
417 requiring that _fileio._FileIO inherits from io.RawIOBase (which
418 would be hard to do since _fileio.c is written in C).
419 """
Guido van Rossuma9e20242007-03-08 00:43:48 +0000420
Guido van Rossum87429772007-04-10 21:06:59 +0000421 def close(self):
422 _fileio._FileIO.close(self)
423 RawIOBase.close(self)
424
Guido van Rossum13633bb2007-04-13 18:42:35 +0000425 @property
426 def name(self):
427 return self._name
428
429 @property
430 def mode(self):
431 return self._mode
432
Guido van Rossuma9e20242007-03-08 00:43:48 +0000433
Guido van Rossum28524c72007-02-27 05:47:44 +0000434class SocketIO(RawIOBase):
435
436 """Raw I/O implementation for stream sockets."""
437
Guido van Rossum17e43e52007-02-27 15:45:13 +0000438 # XXX More docs
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000439
Guido van Rossum28524c72007-02-27 05:47:44 +0000440 def __init__(self, sock, mode):
441 assert mode in ("r", "w", "rw")
Guido van Rossum141f7672007-04-10 00:22:16 +0000442 RawIOBase.__init__(self)
Guido van Rossum28524c72007-02-27 05:47:44 +0000443 self._sock = sock
444 self._mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000445
446 def readinto(self, b):
447 return self._sock.recv_into(b)
448
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000449 def read(self, n: int = None) -> bytes:
450 """read(n: int) -> bytes. Read and return up to n bytes.
451
452 Returns an empty bytes array on EOF, or None if the object is
453 set not to block and has no data to read.
454 """
455 if n is None:
456 n = -1
457 if n >= 0:
458 return RawIOBase.read(self, n)
459 # Support reading until the end.
460 # XXX Why doesn't RawIOBase support this?
461 data = b""
462 while True:
463 more = RawIOBase.read(self, DEFAULT_BUFFER_SIZE)
464 if not more:
465 break
466 data += more
467 return data
468
Guido van Rossum28524c72007-02-27 05:47:44 +0000469 def write(self, b):
470 return self._sock.send(b)
471
472 def close(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000473 if not self.closed:
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000474 RawIOBase.close(self)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000475
Guido van Rossum28524c72007-02-27 05:47:44 +0000476 def readable(self):
477 return "r" in self._mode
478
479 def writable(self):
480 return "w" in self._mode
481
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000482 def fileno(self):
483 return self._sock.fileno()
Neal Norwitz8b41c3d2007-02-27 06:26:14 +0000484
Guido van Rossum28524c72007-02-27 05:47:44 +0000485
Guido van Rossumcce92b22007-04-10 14:41:39 +0000486class BufferedIOBase(IOBase):
Guido van Rossum141f7672007-04-10 00:22:16 +0000487
488 """Base class for buffered IO objects.
489
490 The main difference with RawIOBase is that the read() method
491 supports omitting the size argument, and does not have a default
492 implementation that defers to readinto().
493
494 In addition, read(), readinto() and write() may raise
495 BlockingIOError if the underlying raw stream is in non-blocking
496 mode and not ready; unlike their raw counterparts, they will never
497 return None.
498
499 A typical implementation should not inherit from a RawIOBase
500 implementation, but wrap one.
501 """
502
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000503 def read(self, n: int = None) -> bytes:
504 """read(n: int = None) -> bytes. Read and return up to n bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000505
Guido van Rossum024da5c2007-05-17 23:59:11 +0000506 If the argument is omitted, None, or negative, reads and
507 returns all data until EOF.
Guido van Rossum141f7672007-04-10 00:22:16 +0000508
509 If the argument is positive, and the underlying raw stream is
510 not 'interactive', multiple raw reads may be issued to satisfy
511 the byte count (unless EOF is reached first). But for
512 interactive raw streams (XXX and for pipes?), at most one raw
513 read will be issued, and a short result does not imply that
514 EOF is imminent.
515
516 Returns an empty bytes array on EOF.
517
518 Raises BlockingIOError if the underlying raw stream has no
519 data at the moment.
520 """
521 self._unsupported("read")
522
523 def readinto(self, b: bytes) -> int:
524 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
525
526 Like read(), this may issue multiple reads to the underlying
527 raw stream, unless the latter is 'interactive' (XXX or a
528 pipe?).
529
530 Returns the number of bytes read (0 for EOF).
531
532 Raises BlockingIOError if the underlying raw stream has no
533 data at the moment.
534 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000535 # XXX This ought to work with anything that supports the buffer API
Guido van Rossum87429772007-04-10 21:06:59 +0000536 data = self.read(len(b))
537 n = len(data)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000538 try:
539 b[:n] = data
540 except TypeError as err:
541 import array
542 if not isinstance(b, array.array):
543 raise err
544 b[:n] = array.array('b', data)
Guido van Rossum87429772007-04-10 21:06:59 +0000545 return n
Guido van Rossum141f7672007-04-10 00:22:16 +0000546
547 def write(self, b: bytes) -> int:
548 """write(b: bytes) -> int. Write the given buffer to the IO stream.
549
550 Returns the number of bytes written, which is never less than
551 len(b).
552
553 Raises BlockingIOError if the buffer is full and the
554 underlying raw stream cannot accept more data at the moment.
555 """
556 self._unsupported("write")
557
558
559class _BufferedIOMixin(BufferedIOBase):
560
561 """A mixin implementation of BufferedIOBase with an underlying raw stream.
562
563 This passes most requests on to the underlying raw stream. It
564 does *not* provide implementations of read(), readinto() or
565 write().
566 """
567
568 def __init__(self, raw):
569 self.raw = raw
570
571 ### Positioning ###
572
573 def seek(self, pos, whence=0):
Guido van Rossum53807da2007-04-10 19:01:47 +0000574 return self.raw.seek(pos, whence)
Guido van Rossum141f7672007-04-10 00:22:16 +0000575
576 def tell(self):
577 return self.raw.tell()
578
579 def truncate(self, pos=None):
Guido van Rossum7165cb12007-07-10 06:54:34 +0000580 if pos is None:
581 pos = self.tell()
Guido van Rossum87429772007-04-10 21:06:59 +0000582 return self.raw.truncate(pos)
Guido van Rossum141f7672007-04-10 00:22:16 +0000583
584 ### Flush and close ###
585
586 def flush(self):
587 self.raw.flush()
588
589 def close(self):
590 self.flush()
591 self.raw.close()
592
593 ### Inquiries ###
594
595 def seekable(self):
596 return self.raw.seekable()
597
598 def readable(self):
599 return self.raw.readable()
600
601 def writable(self):
602 return self.raw.writable()
603
604 @property
605 def closed(self):
606 return self.raw.closed
607
608 ### Lower-level APIs ###
609
610 def fileno(self):
611 return self.raw.fileno()
612
613 def isatty(self):
614 return self.raw.isatty()
615
616
Guido van Rossum024da5c2007-05-17 23:59:11 +0000617class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000618
Guido van Rossum024da5c2007-05-17 23:59:11 +0000619 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000620
Guido van Rossum024da5c2007-05-17 23:59:11 +0000621 # XXX More docs
622
623 def __init__(self, initial_bytes=None):
624 buffer = b""
625 if initial_bytes is not None:
626 buffer += initial_bytes
Guido van Rossum78892e42007-04-06 17:31:18 +0000627 self._buffer = buffer
Guido van Rossum28524c72007-02-27 05:47:44 +0000628 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000629
630 def getvalue(self):
631 return self._buffer
632
Guido van Rossum024da5c2007-05-17 23:59:11 +0000633 def read(self, n=None):
634 if n is None:
635 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000636 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000637 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000638 newpos = min(len(self._buffer), self._pos + n)
639 b = self._buffer[self._pos : newpos]
640 self._pos = newpos
641 return b
642
Guido van Rossum024da5c2007-05-17 23:59:11 +0000643 def read1(self, n):
644 return self.read(n)
645
Guido van Rossum28524c72007-02-27 05:47:44 +0000646 def write(self, b):
647 n = len(b)
648 newpos = self._pos + n
649 self._buffer[self._pos:newpos] = b
650 self._pos = newpos
651 return n
652
653 def seek(self, pos, whence=0):
654 if whence == 0:
655 self._pos = max(0, pos)
656 elif whence == 1:
657 self._pos = max(0, self._pos + pos)
658 elif whence == 2:
659 self._pos = max(0, len(self._buffer) + pos)
660 else:
661 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000662 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000663
664 def tell(self):
665 return self._pos
666
667 def truncate(self, pos=None):
668 if pos is None:
669 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000670 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000671 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000672
673 def readable(self):
674 return True
675
676 def writable(self):
677 return True
678
679 def seekable(self):
680 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000681
682
Guido van Rossum141f7672007-04-10 00:22:16 +0000683class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000684
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000685 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000686
Guido van Rossum78892e42007-04-06 17:31:18 +0000687 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000688 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000689 """
690 assert raw.readable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000691 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000692 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000693 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000694
Guido van Rossum024da5c2007-05-17 23:59:11 +0000695 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000696 """Read n bytes.
697
698 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000699 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000700 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000701 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000702 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000703 if n is None:
704 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000705 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000706 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000707 to_read = max(self.buffer_size,
708 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000709 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000710 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000711 nodata_val = current
712 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000713 self._read_buf += current
714 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000715 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000716 n = len(self._read_buf)
717 out = self._read_buf[:n]
718 self._read_buf = self._read_buf[n:]
719 else:
720 out = nodata_val
721 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000722
Guido van Rossum13633bb2007-04-13 18:42:35 +0000723 def peek(self, n=0, *, unsafe=False):
724 """Returns buffered bytes without advancing the position.
725
726 The argument indicates a desired minimal number of bytes; we
727 do at most one raw read to satisfy it. We never return more
728 than self.buffer_size.
729
730 Unless unsafe=True is passed, we return a copy.
731 """
732 want = min(n, self.buffer_size)
733 have = len(self._read_buf)
734 if have < want:
735 to_read = self.buffer_size - have
736 current = self.raw.read(to_read)
737 if current:
738 self._read_buf += current
739 result = self._read_buf
740 if unsafe:
741 result = result[:]
742 return result
743
744 def read1(self, n):
745 """Reads up to n bytes.
746
747 Returns up to n bytes. If at least one byte is buffered,
748 we only return buffered bytes. Otherwise, we do one
749 raw read.
750 """
751 if n <= 0:
752 return b""
753 self.peek(1, unsafe=True)
754 return self.read(min(n, len(self._read_buf)))
755
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000756 def tell(self):
757 return self.raw.tell() - len(self._read_buf)
758
759 def seek(self, pos, whence=0):
760 if whence == 1:
761 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000762 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000763 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000764 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000765
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000766
Guido van Rossum141f7672007-04-10 00:22:16 +0000767class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000768
Guido van Rossum78892e42007-04-06 17:31:18 +0000769 # XXX docstring
770
Guido van Rossum141f7672007-04-10 00:22:16 +0000771 def __init__(self, raw,
772 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000773 assert raw.writable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000774 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000775 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000776 self.max_buffer_size = (2*buffer_size
777 if max_buffer_size is None
778 else max_buffer_size)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000779 self._write_buf = b""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000780
781 def write(self, b):
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000782 if not isinstance(b, bytes):
Guido van Rossum7165cb12007-07-10 06:54:34 +0000783 if hasattr(b, "__index__"):
784 raise TypeError("Can't write object of type %s" %
785 type(b).__name__)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000786 b = bytes(b)
Guido van Rossum01a27522007-03-07 01:00:12 +0000787 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000788 if len(self._write_buf) > self.buffer_size:
789 # We're full, so let's pre-flush the buffer
790 try:
791 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000792 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000793 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000794 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000795 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000796 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000797 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000798 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000799 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000800 try:
801 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000802 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000803 if (len(self._write_buf) > self.max_buffer_size):
804 # We've hit max_buffer_size. We have to accept a partial
805 # write and cut back our buffer.
806 overage = len(self._write_buf) - self.max_buffer_size
807 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000808 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000809 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000810
811 def flush(self):
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000812 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000813 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000814 while self._write_buf:
815 n = self.raw.write(self._write_buf)
816 del self._write_buf[:n]
817 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000818 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000819 n = e.characters_written
820 del self._write_buf[:n]
821 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000822 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000823
824 def tell(self):
825 return self.raw.tell() + len(self._write_buf)
826
827 def seek(self, pos, whence=0):
828 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000829 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000830
Guido van Rossum01a27522007-03-07 01:00:12 +0000831
Guido van Rossum141f7672007-04-10 00:22:16 +0000832class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000833
Guido van Rossum01a27522007-03-07 01:00:12 +0000834 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000835
Guido van Rossum141f7672007-04-10 00:22:16 +0000836 A buffered reader object and buffered writer object put together
837 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000838
839 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000840
841 XXX The usefulness of this (compared to having two separate IO
842 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000843 """
844
Guido van Rossum141f7672007-04-10 00:22:16 +0000845 def __init__(self, reader, writer,
846 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
847 """Constructor.
848
849 The arguments are two RawIO instances.
850 """
Guido van Rossum01a27522007-03-07 01:00:12 +0000851 assert reader.readable()
852 assert writer.writable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000853 self.reader = BufferedReader(reader, buffer_size)
854 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000855
Guido van Rossum024da5c2007-05-17 23:59:11 +0000856 def read(self, n=None):
857 if n is None:
858 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000859 return self.reader.read(n)
860
Guido van Rossum141f7672007-04-10 00:22:16 +0000861 def readinto(self, b):
862 return self.reader.readinto(b)
863
Guido van Rossum01a27522007-03-07 01:00:12 +0000864 def write(self, b):
865 return self.writer.write(b)
866
Guido van Rossum13633bb2007-04-13 18:42:35 +0000867 def peek(self, n=0, *, unsafe=False):
868 return self.reader.peek(n, unsafe=unsafe)
869
870 def read1(self, n):
871 return self.reader.read1(n)
872
Guido van Rossum01a27522007-03-07 01:00:12 +0000873 def readable(self):
874 return self.reader.readable()
875
876 def writable(self):
877 return self.writer.writable()
878
879 def flush(self):
880 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000881
Guido van Rossum01a27522007-03-07 01:00:12 +0000882 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000883 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000884 self.reader.close()
885
886 def isatty(self):
887 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000888
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000889 @property
890 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000891 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000892
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000893
Guido van Rossum141f7672007-04-10 00:22:16 +0000894class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000895
Guido van Rossum78892e42007-04-06 17:31:18 +0000896 # XXX docstring
897
Guido van Rossum141f7672007-04-10 00:22:16 +0000898 def __init__(self, raw,
899 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000900 assert raw.seekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000901 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000902 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
903
Guido van Rossum01a27522007-03-07 01:00:12 +0000904 def seek(self, pos, whence=0):
905 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000906 # First do the raw seek, then empty the read buffer, so that
907 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000908 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000909 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000910 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000911
912 def tell(self):
913 if (self._write_buf):
914 return self.raw.tell() + len(self._write_buf)
915 else:
916 return self.raw.tell() - len(self._read_buf)
917
Guido van Rossum024da5c2007-05-17 23:59:11 +0000918 def read(self, n=None):
919 if n is None:
920 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000921 self.flush()
922 return BufferedReader.read(self, n)
923
Guido van Rossum141f7672007-04-10 00:22:16 +0000924 def readinto(self, b):
925 self.flush()
926 return BufferedReader.readinto(self, b)
927
Guido van Rossum13633bb2007-04-13 18:42:35 +0000928 def peek(self, n=0, *, unsafe=False):
929 self.flush()
930 return BufferedReader.peek(self, n, unsafe=unsafe)
931
932 def read1(self, n):
933 self.flush()
934 return BufferedReader.read1(self, n)
935
Guido van Rossum01a27522007-03-07 01:00:12 +0000936 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +0000937 if self._read_buf:
938 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
939 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +0000940 return BufferedWriter.write(self, b)
941
Guido van Rossum78892e42007-04-06 17:31:18 +0000942
Guido van Rossumcce92b22007-04-10 14:41:39 +0000943class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +0000944
945 """Base class for text I/O.
946
947 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +0000948
949 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +0000950 """
951
952 def read(self, n: int = -1) -> str:
953 """read(n: int = -1) -> str. Read at most n characters from stream.
954
955 Read from underlying buffer until we have n characters or we hit EOF.
956 If n is negative or omitted, read until EOF.
957 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000958 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +0000959
Guido van Rossum9b76da62007-04-11 01:09:03 +0000960 def write(self, s: str) -> int:
961 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000962 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +0000963
Guido van Rossum9b76da62007-04-11 01:09:03 +0000964 def truncate(self, pos: int = None) -> int:
965 """truncate(pos: int = None) -> int. Truncate size to pos."""
966 self.flush()
967 if pos is None:
968 pos = self.tell()
969 self.seek(pos)
970 return self.buffer.truncate()
971
Guido van Rossum78892e42007-04-06 17:31:18 +0000972 def readline(self) -> str:
973 """readline() -> str. Read until newline or EOF.
974
975 Returns an empty string if EOF is hit immediately.
976 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000977 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +0000978
Guido van Rossumfc3436b2007-05-24 17:58:06 +0000979 @property
980 def encoding(self):
981 """Subclasses should override."""
982 return None
983
Guido van Rossum78892e42007-04-06 17:31:18 +0000984
985class TextIOWrapper(TextIOBase):
986
987 """Buffered text stream.
988
989 Character and line based layer over a BufferedIOBase object.
990 """
991
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +0000992 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +0000993
994 def __init__(self, buffer, encoding=None, newline=None):
Guido van Rossum9b76da62007-04-11 01:09:03 +0000995 if newline not in (None, "\n", "\r\n"):
996 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +0000997 if encoding is None:
998 # XXX This is questionable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000999 encoding = sys.getfilesystemencoding() or "latin-1"
Guido van Rossum78892e42007-04-06 17:31:18 +00001000
1001 self.buffer = buffer
1002 self._encoding = encoding
1003 self._newline = newline or os.linesep
1004 self._fix_newlines = newline is None
1005 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +00001006 self._pending = ""
1007 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001008 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001009
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001010 @property
1011 def encoding(self):
1012 return self._encoding
1013
Guido van Rossum9b76da62007-04-11 01:09:03 +00001014 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001015 # tuple (decoder_state, readahead, pending) where decoder_state is
1016 # the second (integer) item of the decoder state, readahead is the
1017 # chunk of bytes that was read, and pending is the characters that
1018 # were rendered by the decoder after feeding it those bytes. We
1019 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001020
1021 def _seekable(self):
1022 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001023
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001024 def flush(self):
1025 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001026 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001027
1028 def close(self):
1029 self.flush()
1030 self.buffer.close()
1031
1032 @property
1033 def closed(self):
1034 return self.buffer.closed
1035
Guido van Rossum9be55972007-04-07 02:59:27 +00001036 def fileno(self):
1037 return self.buffer.fileno()
1038
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001039 def isatty(self):
1040 return self.buffer.isatty()
1041
Guido van Rossum78892e42007-04-06 17:31:18 +00001042 def write(self, s: str):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001043 # XXX What if we were just reading?
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001044 b = s.encode(self._encoding)
1045 if isinstance(b, str):
1046 b = bytes(b)
1047 n = self.buffer.write(b)
1048 if "\n" in s:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001049 # XXX only if isatty
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001050 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001051 self._snapshot = self._decoder = None
1052 return len(s)
Guido van Rossum78892e42007-04-06 17:31:18 +00001053
1054 def _get_decoder(self):
1055 make_decoder = codecs.getincrementaldecoder(self._encoding)
1056 if make_decoder is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001057 raise IOError("Can't find an incremental decoder for encoding %s" %
Guido van Rossum78892e42007-04-06 17:31:18 +00001058 self._encoding)
1059 decoder = self._decoder = make_decoder() # XXX: errors
Guido van Rossum78892e42007-04-06 17:31:18 +00001060 return decoder
1061
Guido van Rossum9b76da62007-04-11 01:09:03 +00001062 def _read_chunk(self):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001063 assert self._decoder is not None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001064 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001065 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001066 pending = self._decoder.decode(readahead, not readahead)
1067 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001068 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001069 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001070 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001071 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001072 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001073
1074 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001075 x = 0
1076 for i in bytes(ds):
1077 x = x<<8 | i
1078 return (x<<64) | pos
1079
1080 def _decode_decoder_state(self, pos):
1081 x, pos = divmod(pos, 1<<64)
1082 if not x:
1083 return None, pos
1084 b = b""
1085 while x:
1086 b.append(x&0xff)
1087 x >>= 8
1088 return str(b[::-1]), pos
1089
1090 def tell(self):
1091 if not self._seekable:
1092 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001093 if not self._telling:
1094 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001095 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001096 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001097 decoder = self._decoder
1098 if decoder is None or self._snapshot is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001099 assert self._pending == ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001100 return position
1101 decoder_state, readahead, pending = self._snapshot
1102 position -= len(readahead)
1103 needed = len(pending) - len(self._pending)
1104 if not needed:
1105 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001106 saved_state = decoder.getstate()
1107 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001108 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001109 n = 0
1110 bb = bytes(1)
1111 for i, bb[0] in enumerate(readahead):
1112 n += len(decoder.decode(bb))
1113 if n >= needed:
1114 decoder_buffer, decoder_state = decoder.getstate()
1115 return self._encode_decoder_state(
1116 decoder_state,
1117 position + (i+1) - len(decoder_buffer))
1118 raise IOError("Can't reconstruct logical file position")
1119 finally:
1120 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001121
1122 def seek(self, pos, whence=0):
1123 if not self._seekable:
1124 raise IOError("Underlying stream is not seekable")
1125 if whence == 1:
1126 if pos != 0:
1127 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001128 pos = self.tell()
1129 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001130 if whence == 2:
1131 if pos != 0:
1132 raise IOError("Can't do nonzero end-relative seeks")
1133 self.flush()
1134 pos = self.buffer.seek(0, 2)
1135 self._snapshot = None
1136 self._pending = ""
1137 self._decoder = None
1138 return pos
1139 if whence != 0:
1140 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1141 (whence,))
1142 if pos < 0:
1143 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001144 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001145 orig_pos = pos
1146 ds, pos = self._decode_decoder_state(pos)
1147 if not ds:
1148 self.buffer.seek(pos)
1149 self._snapshot = None
1150 self._pending = ""
1151 self._decoder = None
1152 return pos
Guido van Rossumd76e7792007-04-17 02:38:04 +00001153 decoder = self._decoder or self._get_decoder()
1154 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001155 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001156 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001157 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001158 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001159 return orig_pos
1160
Guido van Rossum024da5c2007-05-17 23:59:11 +00001161 def read(self, n=None):
1162 if n is None:
1163 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001164 decoder = self._decoder or self._get_decoder()
1165 res = self._pending
1166 if n < 0:
1167 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001168 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001169 self._snapshot = None
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001170 return res.replace("\r\n", "\n")
Guido van Rossum78892e42007-04-06 17:31:18 +00001171 else:
1172 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001173 readahead, pending = self._read_chunk()
1174 res += pending
1175 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001176 break
1177 self._pending = res[n:]
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001178 return res[:n].replace("\r\n", "\n")
Guido van Rossum78892e42007-04-06 17:31:18 +00001179
Guido van Rossum024da5c2007-05-17 23:59:11 +00001180 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001181 self._telling = False
1182 line = self.readline()
1183 if not line:
1184 self._snapshot = None
1185 self._telling = self._seekable
1186 raise StopIteration
1187 return line
1188
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001189 def readline(self, limit=None):
1190 if limit is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001191 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001192 line = self.readline()
1193 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001194 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001195 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001196 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001197
Guido van Rossum78892e42007-04-06 17:31:18 +00001198 line = self._pending
1199 start = 0
1200 decoder = self._decoder or self._get_decoder()
1201
1202 while True:
1203 # In C we'd look for these in parallel of course.
1204 nlpos = line.find("\n", start)
1205 crpos = line.find("\r", start)
1206 if nlpos >= 0 and crpos >= 0:
1207 endpos = min(nlpos, crpos)
1208 else:
1209 endpos = nlpos if nlpos >= 0 else crpos
1210
1211 if endpos != -1:
1212 endc = line[endpos]
1213 if endc == "\n":
1214 ending = "\n"
1215 break
1216
1217 # We've seen \r - is it standalone, \r\n or \r at end of line?
1218 if endpos + 1 < len(line):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001219 if line[endpos+1] == "\n":
Guido van Rossum78892e42007-04-06 17:31:18 +00001220 ending = "\r\n"
1221 else:
1222 ending = "\r"
1223 break
1224 # There might be a following \n in the next block of data ...
1225 start = endpos
1226 else:
1227 start = len(line)
1228
1229 # No line ending seen yet - get more data
1230 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001231 readahead, pending = self._read_chunk()
1232 more_line = pending
1233 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001234 break
1235
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001236 if not more_line:
1237 ending = ""
Guido van Rossum78892e42007-04-06 17:31:18 +00001238 endpos = len(line)
1239 break
1240
1241 line += more_line
1242
1243 nextpos = endpos + len(ending)
1244 self._pending = line[nextpos:]
1245
1246 # XXX Update self.newlines here if we want to support that
1247
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001248 if self._fix_newlines and ending not in ("\n", ""):
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001249 return line[:endpos] + "\n"
Guido van Rossum78892e42007-04-06 17:31:18 +00001250 else:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001251 return line[:nextpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001252
1253
1254class StringIO(TextIOWrapper):
1255
1256 # XXX This is really slow, but fully functional
1257
1258 def __init__(self, initial_value=""):
1259 super(StringIO, self).__init__(BytesIO(), "utf-8")
1260 if initial_value:
1261 self.write(initial_value)
1262 self.seek(0)
1263
1264 def getvalue(self):
1265 return self.buffer.getvalue().decode("utf-8")