blob: 2f2d3c5997f8aea4dede6ed1ddc254fe8abbd69b [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
Neal Norwitz1e50a9f2007-08-11 18:37:05 +000037import io
Guido van Rossum78892e42007-04-06 17:31:18 +000038import warnings
Guido van Rossum28524c72007-02-27 05:47:44 +000039
Guido van Rossum9b76da62007-04-11 01:09:03 +000040# XXX Shouldn't we use st_blksize whenever we can?
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000041DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
Guido van Rossum01a27522007-03-07 01:00:12 +000042
43
Guido van Rossum141f7672007-04-10 00:22:16 +000044class BlockingIOError(IOError):
Guido van Rossum78892e42007-04-06 17:31:18 +000045
Guido van Rossum141f7672007-04-10 00:22:16 +000046 """Exception raised when I/O would block on a non-blocking I/O stream."""
47
48 def __init__(self, errno, strerror, characters_written=0):
Guido van Rossum01a27522007-03-07 01:00:12 +000049 IOError.__init__(self, errno, strerror)
50 self.characters_written = characters_written
51
Guido van Rossum68bbcd22007-02-27 17:19:33 +000052
Guido van Rossum9cbfffd2007-06-07 00:54:15 +000053def open(file, mode="r", buffering=None, encoding=None, newline=None):
Guido van Rossum17e43e52007-02-27 15:45:13 +000054 """Replacement for the built-in open function.
55
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.
64 newline: optional newlines specifier; must be None, '\n' or '\r\n';
65 specifies the line ending expected on input and written on
66 output. If None, use universal newlines on input and
67 use os.linesep on output.
Guido van Rossum17e43e52007-02-27 15:45:13 +000068
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000069 (*) If a file descriptor is given, it is closed when the returned
70 I/O object is closed. If you don't want this to happen, use
71 os.dup() to create a duplicate file descriptor.
72
Guido van Rossum17e43e52007-02-27 15:45:13 +000073 Mode strings characters:
74 'r': open for reading (default)
75 'w': open for writing, truncating the file first
76 'a': open for writing, appending to the end if the file exists
77 'b': binary mode
78 't': text mode (default)
79 '+': open a disk file for updating (implies reading and writing)
Guido van Rossum9be55972007-04-07 02:59:27 +000080 'U': universal newline mode (for backwards compatibility)
Guido van Rossum17e43e52007-02-27 15:45:13 +000081
82 Constraints:
83 - encoding must not be given when a binary mode is given
84 - buffering must not be zero when a text mode is given
85
86 Returns:
87 Depending on the mode and buffering arguments, either a raw
88 binary stream, a buffered binary stream, or a buffered text
89 stream, open for reading and/or writing.
90 """
Guido van Rossum9b76da62007-04-11 01:09:03 +000091 # XXX Don't use asserts for these checks; raise TypeError or ValueError
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000092 assert isinstance(file, (basestring, int)), repr(file)
93 assert isinstance(mode, basestring), repr(mode)
94 assert buffering is None or isinstance(buffering, int), repr(buffering)
95 assert encoding is None or isinstance(encoding, basestring), repr(encoding)
Guido van Rossum28524c72007-02-27 05:47:44 +000096 modes = set(mode)
Guido van Rossum9be55972007-04-07 02:59:27 +000097 if modes - set("arwb+tU") or len(mode) > len(modes):
Guido van Rossum28524c72007-02-27 05:47:44 +000098 raise ValueError("invalid mode: %r" % mode)
99 reading = "r" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000100 writing = "w" in modes
Guido van Rossum28524c72007-02-27 05:47:44 +0000101 appending = "a" in modes
102 updating = "+" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000103 text = "t" in modes
104 binary = "b" in modes
Guido van Rossum7165cb12007-07-10 06:54:34 +0000105 if "U" in modes:
106 if writing or appending:
107 raise ValueError("can't use U and writing mode at once")
Guido van Rossum9be55972007-04-07 02:59:27 +0000108 reading = True
Guido van Rossum28524c72007-02-27 05:47:44 +0000109 if text and binary:
110 raise ValueError("can't have text and binary mode at once")
111 if reading + writing + appending > 1:
112 raise ValueError("can't have read/write/append mode at once")
113 if not (reading or writing or appending):
114 raise ValueError("must have exactly one of read/write/append mode")
115 if binary and encoding is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +0000116 raise ValueError("binary mode doesn't take an encoding argument")
117 if binary and newline is not None:
118 raise ValueError("binary mode doesn't take a newline argument")
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000119 raw = FileIO(file,
Guido van Rossum28524c72007-02-27 05:47:44 +0000120 (reading and "r" or "") +
121 (writing and "w" or "") +
122 (appending and "a" or "") +
123 (updating and "+" or ""))
124 if buffering is None:
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000125 buffering = -1
126 if buffering < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000127 buffering = DEFAULT_BUFFER_SIZE
128 # XXX Should default to line buffering if os.isatty(raw.fileno())
Guido van Rossum17e43e52007-02-27 15:45:13 +0000129 try:
130 bs = os.fstat(raw.fileno()).st_blksize
131 except (os.error, AttributeError):
Guido van Rossumbb09b212007-03-18 03:36:28 +0000132 pass
133 else:
Guido van Rossum17e43e52007-02-27 15:45:13 +0000134 if bs > 1:
135 buffering = bs
Guido van Rossum28524c72007-02-27 05:47:44 +0000136 if buffering < 0:
137 raise ValueError("invalid buffering size")
138 if buffering == 0:
139 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000140 raw._name = file
141 raw._mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000142 return raw
143 raise ValueError("can't have unbuffered text I/O")
144 if updating:
145 buffer = BufferedRandom(raw, buffering)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000146 elif writing or appending:
Guido van Rossum28524c72007-02-27 05:47:44 +0000147 buffer = BufferedWriter(raw, buffering)
148 else:
149 assert reading
150 buffer = BufferedReader(raw, buffering)
151 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000152 buffer.name = file
153 buffer.mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000154 return buffer
Guido van Rossum13633bb2007-04-13 18:42:35 +0000155 text = TextIOWrapper(buffer, encoding, newline)
156 text.name = file
157 text.mode = mode
158 return text
Guido van Rossum28524c72007-02-27 05:47:44 +0000159
160
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000161class UnsupportedOperation(ValueError, IOError):
162 pass
163
164
Guido van Rossum141f7672007-04-10 00:22:16 +0000165class IOBase:
Guido van Rossum28524c72007-02-27 05:47:44 +0000166
Guido van Rossum141f7672007-04-10 00:22:16 +0000167 """Base class for all I/O classes.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000168
Guido van Rossum141f7672007-04-10 00:22:16 +0000169 This class provides dummy implementations for many methods that
Guido van Rossum17e43e52007-02-27 15:45:13 +0000170 derived classes can override selectively; the default
171 implementations represent a file that cannot be read, written or
172 seeked.
173
Guido van Rossum141f7672007-04-10 00:22:16 +0000174 This does not define read(), readinto() and write(), nor
175 readline() and friends, since their signatures vary per layer.
Guido van Rossum53807da2007-04-10 19:01:47 +0000176
177 Not that calling any method (even inquiries) on a closed file is
178 undefined. Implementations may raise IOError in this case.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000179 """
180
Guido van Rossum141f7672007-04-10 00:22:16 +0000181 ### Internal ###
182
183 def _unsupported(self, name: str) -> IOError:
184 """Internal: raise an exception for unsupported operations."""
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000185 raise UnsupportedOperation("%s.%s() not supported" %
186 (self.__class__.__name__, name))
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000187
Guido van Rossum141f7672007-04-10 00:22:16 +0000188 ### Positioning ###
189
Guido van Rossum53807da2007-04-10 19:01:47 +0000190 def seek(self, pos: int, whence: int = 0) -> int:
191 """seek(pos: int, whence: int = 0) -> int. Change stream position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000192
193 Seek to byte offset pos relative to position indicated by whence:
194 0 Start of stream (the default). pos should be >= 0;
195 1 Current position - whence may be negative;
196 2 End of stream - whence usually negative.
Guido van Rossum53807da2007-04-10 19:01:47 +0000197 Returns the new absolute position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000198 """
199 self._unsupported("seek")
200
201 def tell(self) -> int:
202 """tell() -> int. Return current stream position."""
Guido van Rossum53807da2007-04-10 19:01:47 +0000203 return self.seek(0, 1)
Guido van Rossum141f7672007-04-10 00:22:16 +0000204
Guido van Rossum87429772007-04-10 21:06:59 +0000205 def truncate(self, pos: int = None) -> int:
206 """truncate(size: int = None) -> int. Truncate file to size bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000207
208 Size defaults to the current IO position as reported by tell().
Guido van Rossum87429772007-04-10 21:06:59 +0000209 Returns the new size.
Guido van Rossum141f7672007-04-10 00:22:16 +0000210 """
211 self._unsupported("truncate")
212
213 ### Flush and close ###
214
215 def flush(self) -> None:
216 """flush() -> None. Flushes write buffers, if applicable.
217
218 This is a no-op for read-only and non-blocking streams.
219 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000220 # XXX Should this return the number of bytes written???
Guido van Rossum141f7672007-04-10 00:22:16 +0000221
222 __closed = False
223
224 def close(self) -> None:
225 """close() -> None. Flushes and closes the IO object.
226
227 This must be idempotent. It should also set a flag for the
228 'closed' property (see below) to test.
229 """
230 if not self.__closed:
Guido van Rossum469734b2007-07-10 12:00:45 +0000231 try:
232 self.flush()
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000233 except IOError:
234 pass # If flush() fails, just give up
235 self.__closed = True
Guido van Rossum141f7672007-04-10 00:22:16 +0000236
237 def __del__(self) -> None:
238 """Destructor. Calls close()."""
239 # The try/except block is in case this is called at program
240 # exit time, when it's possible that globals have already been
241 # deleted, and then the close() call might fail. Since
242 # there's nothing we can do about such failures and they annoy
243 # the end users, we suppress the traceback.
244 try:
245 self.close()
246 except:
247 pass
248
249 ### Inquiries ###
250
251 def seekable(self) -> bool:
252 """seekable() -> bool. Return whether object supports random access.
253
254 If False, seek(), tell() and truncate() will raise IOError.
255 This method may need to do a test seek().
256 """
257 return False
258
259 def readable(self) -> bool:
260 """readable() -> bool. Return whether object was opened for reading.
261
262 If False, read() will raise IOError.
263 """
264 return False
265
266 def writable(self) -> bool:
267 """writable() -> bool. Return whether object was opened for writing.
268
269 If False, write() and truncate() will raise IOError.
270 """
271 return False
272
273 @property
274 def closed(self):
275 """closed: bool. True iff the file has been closed.
276
277 For backwards compatibility, this is a property, not a predicate.
278 """
279 return self.__closed
280
281 ### Context manager ###
282
283 def __enter__(self) -> "IOBase": # That's a forward reference
284 """Context management protocol. Returns self."""
285 return self
286
287 def __exit__(self, *args) -> None:
288 """Context management protocol. Calls close()"""
289 self.close()
290
291 ### Lower-level APIs ###
292
293 # XXX Should these be present even if unimplemented?
294
295 def fileno(self) -> int:
296 """fileno() -> int. Returns underlying file descriptor if one exists.
297
298 Raises IOError if the IO object does not use a file descriptor.
299 """
300 self._unsupported("fileno")
301
302 def isatty(self) -> bool:
303 """isatty() -> int. Returns whether this is an 'interactive' stream.
304
305 Returns False if we don't know.
306 """
Guido van Rossum34d19282007-08-09 01:03:29 +0000307 if self.closed:
308 raise ValueError("isatty() on closed file")
Guido van Rossum141f7672007-04-10 00:22:16 +0000309 return False
310
Guido van Rossum7165cb12007-07-10 06:54:34 +0000311 ### Readline[s] and writelines ###
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000312
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000313 def readline(self, limit: int = -1) -> bytes:
314 """For backwards compatibility, a (slowish) readline()."""
Guido van Rossum2bf71382007-06-08 00:07:57 +0000315 if hasattr(self, "peek"):
316 def nreadahead():
317 readahead = self.peek(1, unsafe=True)
318 if not readahead:
319 return 1
320 n = (readahead.find(b"\n") + 1) or len(readahead)
321 if limit >= 0:
322 n = min(n, limit)
323 return n
324 else:
325 def nreadahead():
326 return 1
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000327 if limit is None:
328 limit = -1
329 res = bytes()
330 while limit < 0 or len(res) < limit:
Guido van Rossum2bf71382007-06-08 00:07:57 +0000331 b = self.read(nreadahead())
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000332 if not b:
333 break
334 res += b
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000335 if res.endswith(b"\n"):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000336 break
337 return res
338
Guido van Rossum7165cb12007-07-10 06:54:34 +0000339 def __iter__(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000340 if self.closed:
341 raise ValueError("__iter__ on closed file")
Guido van Rossum7165cb12007-07-10 06:54:34 +0000342 return self
343
344 def __next__(self):
345 line = self.readline()
346 if not line:
347 raise StopIteration
348 return line
349
350 def readlines(self, hint=None):
351 if hint is None:
352 return list(self)
353 n = 0
354 lines = []
355 for line in self:
356 lines.append(line)
357 n += len(line)
358 if n >= hint:
359 break
360 return lines
361
362 def writelines(self, lines):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000363 if self.closed:
364 raise ValueError("write to closed file")
Guido van Rossum7165cb12007-07-10 06:54:34 +0000365 for line in lines:
366 self.write(line)
367
Guido van Rossum141f7672007-04-10 00:22:16 +0000368
369class RawIOBase(IOBase):
370
371 """Base class for raw binary I/O.
372
373 The read() method is implemented by calling readinto(); derived
374 classes that want to support read() only need to implement
375 readinto() as a primitive operation. In general, readinto()
376 can be more efficient than read().
377
378 (It would be tempting to also provide an implementation of
379 readinto() in terms of read(), in case the latter is a more
380 suitable primitive operation, but that would lead to nasty
381 recursion in case a subclass doesn't implement either.)
382 """
383
Guido van Rossum7165cb12007-07-10 06:54:34 +0000384 def read(self, n: int = -1) -> bytes:
Guido van Rossum78892e42007-04-06 17:31:18 +0000385 """read(n: int) -> bytes. Read and return up to n bytes.
Guido van Rossum01a27522007-03-07 01:00:12 +0000386
387 Returns an empty bytes array on EOF, or None if the object is
388 set not to block and has no data to read.
389 """
Guido van Rossum7165cb12007-07-10 06:54:34 +0000390 if n is None:
391 n = -1
392 if n < 0:
393 return self.readall()
Guido van Rossum28524c72007-02-27 05:47:44 +0000394 b = bytes(n.__index__())
Guido van Rossum00efead2007-03-07 05:23:25 +0000395 n = self.readinto(b)
396 del b[n:]
Guido van Rossum28524c72007-02-27 05:47:44 +0000397 return b
398
Guido van Rossum7165cb12007-07-10 06:54:34 +0000399 def readall(self):
400 """readall() -> bytes. Read until EOF, using multiple read() call."""
401 res = bytes()
402 while True:
403 data = self.read(DEFAULT_BUFFER_SIZE)
404 if not data:
405 break
406 res += data
407 return res
408
Guido van Rossum141f7672007-04-10 00:22:16 +0000409 def readinto(self, b: bytes) -> int:
410 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
Guido van Rossum78892e42007-04-06 17:31:18 +0000411
412 Returns number of bytes read (0 for EOF), or None if the object
413 is set not to block as has no data to read.
414 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000415 self._unsupported("readinto")
Guido van Rossum28524c72007-02-27 05:47:44 +0000416
Guido van Rossum141f7672007-04-10 00:22:16 +0000417 def write(self, b: bytes) -> int:
Guido van Rossum78892e42007-04-06 17:31:18 +0000418 """write(b: bytes) -> int. Write the given buffer to the IO stream.
Guido van Rossum01a27522007-03-07 01:00:12 +0000419
Guido van Rossum78892e42007-04-06 17:31:18 +0000420 Returns the number of bytes written, which may be less than len(b).
Guido van Rossum01a27522007-03-07 01:00:12 +0000421 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000422 self._unsupported("write")
Guido van Rossum28524c72007-02-27 05:47:44 +0000423
Guido van Rossum78892e42007-04-06 17:31:18 +0000424
Guido van Rossum141f7672007-04-10 00:22:16 +0000425class FileIO(_fileio._FileIO, RawIOBase):
Guido van Rossum28524c72007-02-27 05:47:44 +0000426
Guido van Rossum141f7672007-04-10 00:22:16 +0000427 """Raw I/O implementation for OS files.
Guido van Rossum28524c72007-02-27 05:47:44 +0000428
Guido van Rossum141f7672007-04-10 00:22:16 +0000429 This multiply inherits from _FileIO and RawIOBase to make
430 isinstance(io.FileIO(), io.RawIOBase) return True without
431 requiring that _fileio._FileIO inherits from io.RawIOBase (which
432 would be hard to do since _fileio.c is written in C).
433 """
Guido van Rossuma9e20242007-03-08 00:43:48 +0000434
Guido van Rossum87429772007-04-10 21:06:59 +0000435 def close(self):
436 _fileio._FileIO.close(self)
437 RawIOBase.close(self)
438
Guido van Rossum13633bb2007-04-13 18:42:35 +0000439 @property
440 def name(self):
441 return self._name
442
443 @property
444 def mode(self):
445 return self._mode
446
Guido van Rossuma9e20242007-03-08 00:43:48 +0000447
Guido van Rossumcce92b22007-04-10 14:41:39 +0000448class BufferedIOBase(IOBase):
Guido van Rossum141f7672007-04-10 00:22:16 +0000449
450 """Base class for buffered IO objects.
451
452 The main difference with RawIOBase is that the read() method
453 supports omitting the size argument, and does not have a default
454 implementation that defers to readinto().
455
456 In addition, read(), readinto() and write() may raise
457 BlockingIOError if the underlying raw stream is in non-blocking
458 mode and not ready; unlike their raw counterparts, they will never
459 return None.
460
461 A typical implementation should not inherit from a RawIOBase
462 implementation, but wrap one.
463 """
464
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000465 def read(self, n: int = None) -> bytes:
466 """read(n: int = None) -> bytes. Read and return up to n bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000467
Guido van Rossum024da5c2007-05-17 23:59:11 +0000468 If the argument is omitted, None, or negative, reads and
469 returns all data until EOF.
Guido van Rossum141f7672007-04-10 00:22:16 +0000470
471 If the argument is positive, and the underlying raw stream is
472 not 'interactive', multiple raw reads may be issued to satisfy
473 the byte count (unless EOF is reached first). But for
474 interactive raw streams (XXX and for pipes?), at most one raw
475 read will be issued, and a short result does not imply that
476 EOF is imminent.
477
478 Returns an empty bytes array on EOF.
479
480 Raises BlockingIOError if the underlying raw stream has no
481 data at the moment.
482 """
483 self._unsupported("read")
484
485 def readinto(self, b: bytes) -> int:
486 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
487
488 Like read(), this may issue multiple reads to the underlying
489 raw stream, unless the latter is 'interactive' (XXX or a
490 pipe?).
491
492 Returns the number of bytes read (0 for EOF).
493
494 Raises BlockingIOError if the underlying raw stream has no
495 data at the moment.
496 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000497 # XXX This ought to work with anything that supports the buffer API
Guido van Rossum87429772007-04-10 21:06:59 +0000498 data = self.read(len(b))
499 n = len(data)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000500 try:
501 b[:n] = data
502 except TypeError as err:
503 import array
504 if not isinstance(b, array.array):
505 raise err
506 b[:n] = array.array('b', data)
Guido van Rossum87429772007-04-10 21:06:59 +0000507 return n
Guido van Rossum141f7672007-04-10 00:22:16 +0000508
509 def write(self, b: bytes) -> int:
510 """write(b: bytes) -> int. Write the given buffer to the IO stream.
511
512 Returns the number of bytes written, which is never less than
513 len(b).
514
515 Raises BlockingIOError if the buffer is full and the
516 underlying raw stream cannot accept more data at the moment.
517 """
518 self._unsupported("write")
519
520
521class _BufferedIOMixin(BufferedIOBase):
522
523 """A mixin implementation of BufferedIOBase with an underlying raw stream.
524
525 This passes most requests on to the underlying raw stream. It
526 does *not* provide implementations of read(), readinto() or
527 write().
528 """
529
530 def __init__(self, raw):
531 self.raw = raw
532
533 ### Positioning ###
534
535 def seek(self, pos, whence=0):
Guido van Rossum53807da2007-04-10 19:01:47 +0000536 return self.raw.seek(pos, whence)
Guido van Rossum141f7672007-04-10 00:22:16 +0000537
538 def tell(self):
539 return self.raw.tell()
540
541 def truncate(self, pos=None):
Guido van Rossum7165cb12007-07-10 06:54:34 +0000542 if pos is None:
543 pos = self.tell()
Guido van Rossum87429772007-04-10 21:06:59 +0000544 return self.raw.truncate(pos)
Guido van Rossum141f7672007-04-10 00:22:16 +0000545
546 ### Flush and close ###
547
548 def flush(self):
549 self.raw.flush()
550
551 def close(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000552 if not self.closed:
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000553 try:
554 self.flush()
555 except IOError:
556 pass # If flush() fails, just give up
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000557 self.raw.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000558
559 ### Inquiries ###
560
561 def seekable(self):
562 return self.raw.seekable()
563
564 def readable(self):
565 return self.raw.readable()
566
567 def writable(self):
568 return self.raw.writable()
569
570 @property
571 def closed(self):
572 return self.raw.closed
573
574 ### Lower-level APIs ###
575
576 def fileno(self):
577 return self.raw.fileno()
578
579 def isatty(self):
580 return self.raw.isatty()
581
582
Guido van Rossum024da5c2007-05-17 23:59:11 +0000583class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000584
Guido van Rossum024da5c2007-05-17 23:59:11 +0000585 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000586
Guido van Rossum024da5c2007-05-17 23:59:11 +0000587 # XXX More docs
588
589 def __init__(self, initial_bytes=None):
590 buffer = b""
591 if initial_bytes is not None:
592 buffer += initial_bytes
Guido van Rossum78892e42007-04-06 17:31:18 +0000593 self._buffer = buffer
Guido van Rossum28524c72007-02-27 05:47:44 +0000594 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000595
596 def getvalue(self):
597 return self._buffer
598
Guido van Rossum024da5c2007-05-17 23:59:11 +0000599 def read(self, n=None):
600 if n is None:
601 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000602 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000603 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000604 newpos = min(len(self._buffer), self._pos + n)
605 b = self._buffer[self._pos : newpos]
606 self._pos = newpos
607 return b
608
Guido van Rossum024da5c2007-05-17 23:59:11 +0000609 def read1(self, n):
610 return self.read(n)
611
Guido van Rossum28524c72007-02-27 05:47:44 +0000612 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000613 if self.closed:
614 raise ValueError("write to closed file")
Guido van Rossum28524c72007-02-27 05:47:44 +0000615 n = len(b)
616 newpos = self._pos + n
Guido van Rossumb972a782007-07-21 00:25:15 +0000617 if newpos > len(self._buffer):
618 # Inserts null bytes between the current end of the file
619 # and the new write position.
620 padding = '\x00' * (newpos - len(self._buffer) - n)
621 self._buffer[self._pos:newpos - n] = padding
Guido van Rossum28524c72007-02-27 05:47:44 +0000622 self._buffer[self._pos:newpos] = b
623 self._pos = newpos
624 return n
625
626 def seek(self, pos, whence=0):
627 if whence == 0:
628 self._pos = max(0, pos)
629 elif whence == 1:
630 self._pos = max(0, self._pos + pos)
631 elif whence == 2:
632 self._pos = max(0, len(self._buffer) + pos)
633 else:
634 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000635 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000636
637 def tell(self):
638 return self._pos
639
640 def truncate(self, pos=None):
641 if pos is None:
642 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000643 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000644 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000645
646 def readable(self):
647 return True
648
649 def writable(self):
650 return True
651
652 def seekable(self):
653 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000654
655
Guido van Rossum141f7672007-04-10 00:22:16 +0000656class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000657
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000658 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000659
Guido van Rossum78892e42007-04-06 17:31:18 +0000660 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000661 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000662 """
663 assert raw.readable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000664 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000665 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000666 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000667
Guido van Rossum024da5c2007-05-17 23:59:11 +0000668 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000669 """Read n bytes.
670
671 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000672 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000673 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000674 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000675 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000676 if n is None:
677 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000678 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000679 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000680 to_read = max(self.buffer_size,
681 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000682 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000683 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000684 nodata_val = current
685 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000686 self._read_buf += current
687 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000688 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000689 n = len(self._read_buf)
690 out = self._read_buf[:n]
691 self._read_buf = self._read_buf[n:]
692 else:
693 out = nodata_val
694 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000695
Guido van Rossum13633bb2007-04-13 18:42:35 +0000696 def peek(self, n=0, *, unsafe=False):
697 """Returns buffered bytes without advancing the position.
698
699 The argument indicates a desired minimal number of bytes; we
700 do at most one raw read to satisfy it. We never return more
701 than self.buffer_size.
702
703 Unless unsafe=True is passed, we return a copy.
704 """
705 want = min(n, self.buffer_size)
706 have = len(self._read_buf)
707 if have < want:
708 to_read = self.buffer_size - have
709 current = self.raw.read(to_read)
710 if current:
711 self._read_buf += current
712 result = self._read_buf
713 if unsafe:
714 result = result[:]
715 return result
716
717 def read1(self, n):
718 """Reads up to n bytes.
719
720 Returns up to n bytes. If at least one byte is buffered,
721 we only return buffered bytes. Otherwise, we do one
722 raw read.
723 """
724 if n <= 0:
725 return b""
726 self.peek(1, unsafe=True)
727 return self.read(min(n, len(self._read_buf)))
728
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000729 def tell(self):
730 return self.raw.tell() - len(self._read_buf)
731
732 def seek(self, pos, whence=0):
733 if whence == 1:
734 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000735 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000736 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000737 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000738
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000739
Guido van Rossum141f7672007-04-10 00:22:16 +0000740class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000741
Guido van Rossum78892e42007-04-06 17:31:18 +0000742 # XXX docstring
743
Guido van Rossum141f7672007-04-10 00:22:16 +0000744 def __init__(self, raw,
745 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000746 assert raw.writable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000747 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000748 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000749 self.max_buffer_size = (2*buffer_size
750 if max_buffer_size is None
751 else max_buffer_size)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000752 self._write_buf = b""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000753
754 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000755 if self.closed:
756 raise ValueError("write to closed file")
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000757 if not isinstance(b, bytes):
Guido van Rossum7165cb12007-07-10 06:54:34 +0000758 if hasattr(b, "__index__"):
759 raise TypeError("Can't write object of type %s" %
760 type(b).__name__)
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000761 b = bytes(b)
Guido van Rossum01a27522007-03-07 01:00:12 +0000762 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000763 if len(self._write_buf) > self.buffer_size:
764 # We're full, so let's pre-flush the buffer
765 try:
766 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000767 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000768 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000769 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000770 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000771 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000772 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000773 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000774 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000775 try:
776 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000777 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000778 if (len(self._write_buf) > self.max_buffer_size):
779 # We've hit max_buffer_size. We have to accept a partial
780 # write and cut back our buffer.
781 overage = len(self._write_buf) - self.max_buffer_size
782 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000783 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000784 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000785
786 def flush(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000787 if self.closed:
788 raise ValueError("flush of closed file")
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000789 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000790 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000791 while self._write_buf:
792 n = self.raw.write(self._write_buf)
793 del self._write_buf[:n]
794 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000795 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000796 n = e.characters_written
797 del self._write_buf[:n]
798 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000799 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000800
801 def tell(self):
802 return self.raw.tell() + len(self._write_buf)
803
804 def seek(self, pos, whence=0):
805 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000806 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000807
Guido van Rossum01a27522007-03-07 01:00:12 +0000808
Guido van Rossum141f7672007-04-10 00:22:16 +0000809class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000810
Guido van Rossum01a27522007-03-07 01:00:12 +0000811 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000812
Guido van Rossum141f7672007-04-10 00:22:16 +0000813 A buffered reader object and buffered writer object put together
814 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000815
816 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000817
818 XXX The usefulness of this (compared to having two separate IO
819 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000820 """
821
Guido van Rossum141f7672007-04-10 00:22:16 +0000822 def __init__(self, reader, writer,
823 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
824 """Constructor.
825
826 The arguments are two RawIO instances.
827 """
Guido van Rossum01a27522007-03-07 01:00:12 +0000828 assert reader.readable()
829 assert writer.writable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000830 self.reader = BufferedReader(reader, buffer_size)
831 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000832
Guido van Rossum024da5c2007-05-17 23:59:11 +0000833 def read(self, n=None):
834 if n is None:
835 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000836 return self.reader.read(n)
837
Guido van Rossum141f7672007-04-10 00:22:16 +0000838 def readinto(self, b):
839 return self.reader.readinto(b)
840
Guido van Rossum01a27522007-03-07 01:00:12 +0000841 def write(self, b):
842 return self.writer.write(b)
843
Guido van Rossum13633bb2007-04-13 18:42:35 +0000844 def peek(self, n=0, *, unsafe=False):
845 return self.reader.peek(n, unsafe=unsafe)
846
847 def read1(self, n):
848 return self.reader.read1(n)
849
Guido van Rossum01a27522007-03-07 01:00:12 +0000850 def readable(self):
851 return self.reader.readable()
852
853 def writable(self):
854 return self.writer.writable()
855
856 def flush(self):
857 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000858
Guido van Rossum01a27522007-03-07 01:00:12 +0000859 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000860 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000861 self.reader.close()
862
863 def isatty(self):
864 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000865
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000866 @property
867 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000868 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000869
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000870
Guido van Rossum141f7672007-04-10 00:22:16 +0000871class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000872
Guido van Rossum78892e42007-04-06 17:31:18 +0000873 # XXX docstring
874
Guido van Rossum141f7672007-04-10 00:22:16 +0000875 def __init__(self, raw,
876 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000877 assert raw.seekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000878 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000879 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
880
Guido van Rossum01a27522007-03-07 01:00:12 +0000881 def seek(self, pos, whence=0):
882 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000883 # First do the raw seek, then empty the read buffer, so that
884 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000885 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000886 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000887 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000888
889 def tell(self):
890 if (self._write_buf):
891 return self.raw.tell() + len(self._write_buf)
892 else:
893 return self.raw.tell() - len(self._read_buf)
894
Guido van Rossum024da5c2007-05-17 23:59:11 +0000895 def read(self, n=None):
896 if n is None:
897 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000898 self.flush()
899 return BufferedReader.read(self, n)
900
Guido van Rossum141f7672007-04-10 00:22:16 +0000901 def readinto(self, b):
902 self.flush()
903 return BufferedReader.readinto(self, b)
904
Guido van Rossum13633bb2007-04-13 18:42:35 +0000905 def peek(self, n=0, *, unsafe=False):
906 self.flush()
907 return BufferedReader.peek(self, n, unsafe=unsafe)
908
909 def read1(self, n):
910 self.flush()
911 return BufferedReader.read1(self, n)
912
Guido van Rossum01a27522007-03-07 01:00:12 +0000913 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +0000914 if self._read_buf:
915 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
916 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +0000917 return BufferedWriter.write(self, b)
918
Guido van Rossum78892e42007-04-06 17:31:18 +0000919
Guido van Rossumcce92b22007-04-10 14:41:39 +0000920class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +0000921
922 """Base class for text I/O.
923
924 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +0000925
926 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +0000927 """
928
929 def read(self, n: int = -1) -> str:
930 """read(n: int = -1) -> str. Read at most n characters from stream.
931
932 Read from underlying buffer until we have n characters or we hit EOF.
933 If n is negative or omitted, read until EOF.
934 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000935 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +0000936
Guido van Rossum9b76da62007-04-11 01:09:03 +0000937 def write(self, s: str) -> int:
938 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000939 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +0000940
Guido van Rossum9b76da62007-04-11 01:09:03 +0000941 def truncate(self, pos: int = None) -> int:
942 """truncate(pos: int = None) -> int. Truncate size to pos."""
943 self.flush()
944 if pos is None:
945 pos = self.tell()
946 self.seek(pos)
947 return self.buffer.truncate()
948
Guido van Rossum78892e42007-04-06 17:31:18 +0000949 def readline(self) -> str:
950 """readline() -> str. Read until newline or EOF.
951
952 Returns an empty string if EOF is hit immediately.
953 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000954 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +0000955
Guido van Rossumfc3436b2007-05-24 17:58:06 +0000956 @property
957 def encoding(self):
958 """Subclasses should override."""
959 return None
960
Guido van Rossum78892e42007-04-06 17:31:18 +0000961
962class TextIOWrapper(TextIOBase):
963
964 """Buffered text stream.
965
966 Character and line based layer over a BufferedIOBase object.
967 """
968
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +0000969 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +0000970
971 def __init__(self, buffer, encoding=None, newline=None):
Guido van Rossum9b76da62007-04-11 01:09:03 +0000972 if newline not in (None, "\n", "\r\n"):
973 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +0000974 if encoding is None:
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +0000975 try:
976 encoding = os.device_encoding(buffer.fileno())
Neal Norwitz1e50a9f2007-08-11 18:37:05 +0000977 except (AttributeError, io.UnsupportedOperation):
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +0000978 pass
979 if encoding is None:
Martin v. Löwisd78d3b42007-08-11 15:36:45 +0000980 try:
981 import locale
982 except ImportError:
983 # Importing locale may fail if Python is being built
984 encoding = "ascii"
985 else:
986 encoding = locale.getpreferredencoding()
Guido van Rossum78892e42007-04-06 17:31:18 +0000987
988 self.buffer = buffer
989 self._encoding = encoding
990 self._newline = newline or os.linesep
991 self._fix_newlines = newline is None
992 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +0000993 self._pending = ""
994 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +0000995 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +0000996
Guido van Rossumfc3436b2007-05-24 17:58:06 +0000997 @property
998 def encoding(self):
999 return self._encoding
1000
Guido van Rossum9b76da62007-04-11 01:09:03 +00001001 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001002 # tuple (decoder_state, readahead, pending) where decoder_state is
1003 # the second (integer) item of the decoder state, readahead is the
1004 # chunk of bytes that was read, and pending is the characters that
1005 # were rendered by the decoder after feeding it those bytes. We
1006 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001007
1008 def _seekable(self):
1009 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001010
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001011 def flush(self):
1012 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001013 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001014
1015 def close(self):
Guido van Rossum33e7a8e2007-07-22 20:38:07 +00001016 try:
1017 self.flush()
1018 except:
1019 pass # If flush() fails, just give up
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001020 self.buffer.close()
1021
1022 @property
1023 def closed(self):
1024 return self.buffer.closed
1025
Guido van Rossum9be55972007-04-07 02:59:27 +00001026 def fileno(self):
1027 return self.buffer.fileno()
1028
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001029 def isatty(self):
1030 return self.buffer.isatty()
1031
Guido van Rossum78892e42007-04-06 17:31:18 +00001032 def write(self, s: str):
Guido van Rossum4b5386f2007-07-10 09:12:49 +00001033 if self.closed:
1034 raise ValueError("write to closed file")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001035 # XXX What if we were just reading?
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001036 b = s.encode(self._encoding)
1037 if isinstance(b, str):
1038 b = bytes(b)
1039 n = self.buffer.write(b)
1040 if "\n" in s:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001041 # XXX only if isatty
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001042 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001043 self._snapshot = self._decoder = None
1044 return len(s)
Guido van Rossum78892e42007-04-06 17:31:18 +00001045
1046 def _get_decoder(self):
1047 make_decoder = codecs.getincrementaldecoder(self._encoding)
1048 if make_decoder is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001049 raise IOError("Can't find an incremental decoder for encoding %s" %
Guido van Rossum78892e42007-04-06 17:31:18 +00001050 self._encoding)
1051 decoder = self._decoder = make_decoder() # XXX: errors
Guido van Rossum78892e42007-04-06 17:31:18 +00001052 return decoder
1053
Guido van Rossum9b76da62007-04-11 01:09:03 +00001054 def _read_chunk(self):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001055 assert self._decoder is not None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001056 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001057 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001058 pending = self._decoder.decode(readahead, not readahead)
1059 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001060 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001061 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001062 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001063 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001064 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001065
1066 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001067 x = 0
1068 for i in bytes(ds):
1069 x = x<<8 | i
1070 return (x<<64) | pos
1071
1072 def _decode_decoder_state(self, pos):
1073 x, pos = divmod(pos, 1<<64)
1074 if not x:
1075 return None, pos
1076 b = b""
1077 while x:
1078 b.append(x&0xff)
1079 x >>= 8
1080 return str(b[::-1]), pos
1081
1082 def tell(self):
1083 if not self._seekable:
1084 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001085 if not self._telling:
1086 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001087 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001088 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001089 decoder = self._decoder
1090 if decoder is None or self._snapshot is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001091 assert self._pending == ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001092 return position
1093 decoder_state, readahead, pending = self._snapshot
1094 position -= len(readahead)
1095 needed = len(pending) - len(self._pending)
1096 if not needed:
1097 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001098 saved_state = decoder.getstate()
1099 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001100 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001101 n = 0
1102 bb = bytes(1)
1103 for i, bb[0] in enumerate(readahead):
1104 n += len(decoder.decode(bb))
1105 if n >= needed:
1106 decoder_buffer, decoder_state = decoder.getstate()
1107 return self._encode_decoder_state(
1108 decoder_state,
1109 position + (i+1) - len(decoder_buffer))
1110 raise IOError("Can't reconstruct logical file position")
1111 finally:
1112 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001113
1114 def seek(self, pos, whence=0):
1115 if not self._seekable:
1116 raise IOError("Underlying stream is not seekable")
1117 if whence == 1:
1118 if pos != 0:
1119 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001120 pos = self.tell()
1121 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001122 if whence == 2:
1123 if pos != 0:
1124 raise IOError("Can't do nonzero end-relative seeks")
1125 self.flush()
1126 pos = self.buffer.seek(0, 2)
1127 self._snapshot = None
1128 self._pending = ""
1129 self._decoder = None
1130 return pos
1131 if whence != 0:
1132 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1133 (whence,))
1134 if pos < 0:
1135 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001136 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001137 orig_pos = pos
1138 ds, pos = self._decode_decoder_state(pos)
1139 if not ds:
1140 self.buffer.seek(pos)
1141 self._snapshot = None
1142 self._pending = ""
1143 self._decoder = None
1144 return pos
Guido van Rossumd76e7792007-04-17 02:38:04 +00001145 decoder = self._decoder or self._get_decoder()
1146 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001147 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001148 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001149 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001150 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001151 return orig_pos
1152
Guido van Rossum024da5c2007-05-17 23:59:11 +00001153 def read(self, n=None):
1154 if n is None:
1155 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001156 decoder = self._decoder or self._get_decoder()
1157 res = self._pending
1158 if n < 0:
1159 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001160 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001161 self._snapshot = None
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001162 return res.replace("\r\n", "\n")
Guido van Rossum78892e42007-04-06 17:31:18 +00001163 else:
1164 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001165 readahead, pending = self._read_chunk()
1166 res += pending
1167 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001168 break
1169 self._pending = res[n:]
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001170 return res[:n].replace("\r\n", "\n")
Guido van Rossum78892e42007-04-06 17:31:18 +00001171
Guido van Rossum024da5c2007-05-17 23:59:11 +00001172 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001173 self._telling = False
1174 line = self.readline()
1175 if not line:
1176 self._snapshot = None
1177 self._telling = self._seekable
1178 raise StopIteration
1179 return line
1180
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001181 def readline(self, limit=None):
1182 if limit is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001183 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001184 line = self.readline()
1185 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001186 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001187 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001188 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001189
Guido van Rossum78892e42007-04-06 17:31:18 +00001190 line = self._pending
1191 start = 0
1192 decoder = self._decoder or self._get_decoder()
1193
1194 while True:
1195 # In C we'd look for these in parallel of course.
1196 nlpos = line.find("\n", start)
1197 crpos = line.find("\r", start)
1198 if nlpos >= 0 and crpos >= 0:
1199 endpos = min(nlpos, crpos)
1200 else:
1201 endpos = nlpos if nlpos >= 0 else crpos
1202
1203 if endpos != -1:
1204 endc = line[endpos]
1205 if endc == "\n":
1206 ending = "\n"
1207 break
1208
1209 # We've seen \r - is it standalone, \r\n or \r at end of line?
1210 if endpos + 1 < len(line):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001211 if line[endpos+1] == "\n":
Guido van Rossum78892e42007-04-06 17:31:18 +00001212 ending = "\r\n"
1213 else:
1214 ending = "\r"
1215 break
1216 # There might be a following \n in the next block of data ...
1217 start = endpos
1218 else:
1219 start = len(line)
1220
1221 # No line ending seen yet - get more data
1222 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001223 readahead, pending = self._read_chunk()
1224 more_line = pending
1225 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001226 break
1227
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001228 if not more_line:
1229 ending = ""
Guido van Rossum78892e42007-04-06 17:31:18 +00001230 endpos = len(line)
1231 break
1232
1233 line += more_line
1234
1235 nextpos = endpos + len(ending)
1236 self._pending = line[nextpos:]
1237
1238 # XXX Update self.newlines here if we want to support that
1239
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001240 if self._fix_newlines and ending not in ("\n", ""):
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001241 return line[:endpos] + "\n"
Guido van Rossum78892e42007-04-06 17:31:18 +00001242 else:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001243 return line[:nextpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001244
1245
1246class StringIO(TextIOWrapper):
1247
1248 # XXX This is really slow, but fully functional
1249
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001250 def __init__(self, initial_value="", encoding="utf-8", newline=None):
1251 super(StringIO, self).__init__(BytesIO(),
1252 encoding=encoding,
1253 newline=newline)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001254 if initial_value:
Guido van Rossum34d19282007-08-09 01:03:29 +00001255 if not isinstance(initial_value, basestring):
1256 initial_value = str(initial_value)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001257 self.write(initial_value)
1258 self.seek(0)
1259
1260 def getvalue(self):
Guido van Rossum34d19282007-08-09 01:03:29 +00001261 self.flush()
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001262 return self.buffer.getvalue().decode(self._encoding)