blob: 710027852b5921d3835d10353d3aae4b1901dfb3 [file] [log] [blame]
Guido van Rossum53807da2007-04-10 19:01:47 +00001"""New I/O library conforming to PEP 3116.
Guido van Rossum28524c72007-02-27 05:47:44 +00002
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00003This is a prototype; hopefully eventually some of this will be
4reimplemented in C.
Guido van Rossum17e43e52007-02-27 15:45:13 +00005
Guido van Rossum53807da2007-04-10 19:01:47 +00006Conformance of alternative implementations: all arguments are intended
7to be positional-only except the arguments of the open() function.
8Argument names except those of the open() function are not part of the
9specification. Instance variables and methods whose name starts with
10a leading underscore are not part of the specification (except "magic"
11names like __iter__). Only the top-level names listed in the __all__
12variable are part of the specification.
Guido van Rossumc819dea2007-03-15 18:59:31 +000013
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +000014XXX edge cases when switching between reading/writing
Guido van Rossumc819dea2007-03-15 18:59:31 +000015XXX need to support 1 meaning line-buffered
Guido van Rossum9b76da62007-04-11 01:09:03 +000016XXX whenever an argument is None, use the default value
17XXX read/write ops should check readable/writable
Guido van Rossumd4103952007-04-12 05:44:49 +000018XXX buffered readinto should work with arbitrary buffer objects
Guido van Rossumd76e7792007-04-17 02:38:04 +000019XXX use incremental encoder for text output, at least for UTF-16 and UTF-8-SIG
Guido van Rossum5abbf752007-08-27 17:39:33 +000020XXX check writable, readable and seekable in appropriate places
Guido van Rossum28524c72007-02-27 05:47:44 +000021"""
22
Guido van Rossum68bbcd22007-02-27 17:19:33 +000023__author__ = ("Guido van Rossum <guido@python.org>, "
Guido van Rossum78892e42007-04-06 17:31:18 +000024 "Mike Verdone <mike.verdone@gmail.com>, "
25 "Mark Russell <mark.russell@zen.co.uk>")
Guido van Rossum28524c72007-02-27 05:47:44 +000026
Guido van Rossum141f7672007-04-10 00:22:16 +000027__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO",
Guido van Rossum5abbf752007-08-27 17:39:33 +000028 "BytesIO", "StringIO", "BufferedIOBase",
Guido van Rossum01a27522007-03-07 01:00:12 +000029 "BufferedReader", "BufferedWriter", "BufferedRWPair",
Guido van Rossum141f7672007-04-10 00:22:16 +000030 "BufferedRandom", "TextIOBase", "TextIOWrapper"]
Guido van Rossum28524c72007-02-27 05:47:44 +000031
32import os
Guido van Rossumb7f136e2007-08-22 18:14:10 +000033import abc
Guido van Rossum78892e42007-04-06 17:31:18 +000034import sys
35import codecs
Guido van Rossum141f7672007-04-10 00:22:16 +000036import _fileio
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 Rossum5abbf752007-08-27 17:39:33 +000040# open() uses 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.
Guido van Rossum8358db22007-08-18 21:39:55 +000064 newline: optional newlines specifier; must be None, '', '\n', '\r'
65 or '\r\n'; all other values are illegal. It controls the
66 handling of line endings. It works as follows:
67
68 * On input, if `newline` is `None`, universal newlines
69 mode is enabled. Lines in the input can end in `'\n'`,
70 `'\r'`, or `'\r\n'`, and these are translated into
71 `'\n'` before being returned to the caller. If it is
72 `''`, universal newline mode is enabled, but line endings
73 are returned to the caller untranslated. If it has any of
74 the other legal values, input lines are only terminated by
75 the given string, and the line ending is returned to the
76 caller untranslated.
77
78 * On output, if `newline` is `None`, any `'\n'`
79 characters written are translated to the system default
80 line separator, `os.linesep`. If `newline` is `''`,
81 no translation takes place. If `newline` is any of the
82 other legal values, any `'\n'` characters written are
83 translated to the given string.
Guido van Rossum17e43e52007-02-27 15:45:13 +000084
Guido van Rossum4f0db6e2007-04-08 23:59:06 +000085 (*) If a file descriptor is given, it is closed when the returned
86 I/O object is closed. If you don't want this to happen, use
87 os.dup() to create a duplicate file descriptor.
88
Guido van Rossum17e43e52007-02-27 15:45:13 +000089 Mode strings characters:
90 'r': open for reading (default)
91 'w': open for writing, truncating the file first
92 'a': open for writing, appending to the end if the file exists
93 'b': binary mode
94 't': text mode (default)
95 '+': open a disk file for updating (implies reading and writing)
Guido van Rossum9be55972007-04-07 02:59:27 +000096 'U': universal newline mode (for backwards compatibility)
Guido van Rossum17e43e52007-02-27 15:45:13 +000097
98 Constraints:
99 - encoding must not be given when a binary mode is given
100 - buffering must not be zero when a text mode is given
101
102 Returns:
103 Depending on the mode and buffering arguments, either a raw
104 binary stream, a buffered binary stream, or a buffered text
105 stream, open for reading and/or writing.
106 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000107 if not isinstance(file, (basestring, int)):
108 raise TypeError("invalid file: %r" % file)
109 if not isinstance(mode, basestring):
110 raise TypeError("invalid mode: %r" % mode)
111 if buffering is not None and not isinstance(buffering, int):
112 raise TypeError("invalid buffering: %r" % buffering)
113 if encoding is not None and not isinstance(encoding, basestring):
114 raise TypeError("invalid encoding: %r" % encoding)
Guido van Rossum28524c72007-02-27 05:47:44 +0000115 modes = set(mode)
Guido van Rossum9be55972007-04-07 02:59:27 +0000116 if modes - set("arwb+tU") or len(mode) > len(modes):
Guido van Rossum28524c72007-02-27 05:47:44 +0000117 raise ValueError("invalid mode: %r" % mode)
118 reading = "r" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000119 writing = "w" in modes
Guido van Rossum28524c72007-02-27 05:47:44 +0000120 appending = "a" in modes
121 updating = "+" in modes
Guido van Rossum17e43e52007-02-27 15:45:13 +0000122 text = "t" in modes
123 binary = "b" in modes
Guido van Rossum7165cb12007-07-10 06:54:34 +0000124 if "U" in modes:
125 if writing or appending:
126 raise ValueError("can't use U and writing mode at once")
Guido van Rossum9be55972007-04-07 02:59:27 +0000127 reading = True
Guido van Rossum28524c72007-02-27 05:47:44 +0000128 if text and binary:
129 raise ValueError("can't have text and binary mode at once")
130 if reading + writing + appending > 1:
131 raise ValueError("can't have read/write/append mode at once")
132 if not (reading or writing or appending):
133 raise ValueError("must have exactly one of read/write/append mode")
134 if binary and encoding is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +0000135 raise ValueError("binary mode doesn't take an encoding argument")
136 if binary and newline is not None:
137 raise ValueError("binary mode doesn't take a newline argument")
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000138 raw = FileIO(file,
Guido van Rossum28524c72007-02-27 05:47:44 +0000139 (reading and "r" or "") +
140 (writing and "w" or "") +
141 (appending and "a" or "") +
142 (updating and "+" or ""))
143 if buffering is None:
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000144 buffering = -1
Guido van Rossum5abbf752007-08-27 17:39:33 +0000145 if buffering < 0 and raw.isatty():
146 buffering = 1
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000147 if buffering < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000148 buffering = DEFAULT_BUFFER_SIZE
Guido van Rossum17e43e52007-02-27 15:45:13 +0000149 try:
150 bs = os.fstat(raw.fileno()).st_blksize
151 except (os.error, AttributeError):
Guido van Rossumbb09b212007-03-18 03:36:28 +0000152 pass
153 else:
Guido van Rossum17e43e52007-02-27 15:45:13 +0000154 if bs > 1:
155 buffering = bs
Guido van Rossum28524c72007-02-27 05:47:44 +0000156 if buffering < 0:
157 raise ValueError("invalid buffering size")
158 if buffering == 0:
159 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000160 raw._name = file
161 raw._mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000162 return raw
163 raise ValueError("can't have unbuffered text I/O")
164 if updating:
165 buffer = BufferedRandom(raw, buffering)
Guido van Rossum17e43e52007-02-27 15:45:13 +0000166 elif writing or appending:
Guido van Rossum28524c72007-02-27 05:47:44 +0000167 buffer = BufferedWriter(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000168 elif reading:
Guido van Rossum28524c72007-02-27 05:47:44 +0000169 buffer = BufferedReader(raw, buffering)
Guido van Rossum5abbf752007-08-27 17:39:33 +0000170 else:
171 raise ValueError("unknown mode: %r" % mode)
Guido van Rossum28524c72007-02-27 05:47:44 +0000172 if binary:
Guido van Rossum13633bb2007-04-13 18:42:35 +0000173 buffer.name = file
174 buffer.mode = mode
Guido van Rossum28524c72007-02-27 05:47:44 +0000175 return buffer
Guido van Rossum13633bb2007-04-13 18:42:35 +0000176 text = TextIOWrapper(buffer, encoding, newline)
177 text.name = file
178 text.mode = mode
179 return text
Guido van Rossum28524c72007-02-27 05:47:44 +0000180
181
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000182class UnsupportedOperation(ValueError, IOError):
183 pass
184
185
Guido van Rossumb7f136e2007-08-22 18:14:10 +0000186class IOBase(metaclass=abc.ABCMeta):
Guido van Rossum28524c72007-02-27 05:47:44 +0000187
Guido van Rossum141f7672007-04-10 00:22:16 +0000188 """Base class for all I/O classes.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000189
Guido van Rossum141f7672007-04-10 00:22:16 +0000190 This class provides dummy implementations for many methods that
Guido van Rossum17e43e52007-02-27 15:45:13 +0000191 derived classes can override selectively; the default
192 implementations represent a file that cannot be read, written or
193 seeked.
194
Guido van Rossum141f7672007-04-10 00:22:16 +0000195 This does not define read(), readinto() and write(), nor
196 readline() and friends, since their signatures vary per layer.
Guido van Rossum53807da2007-04-10 19:01:47 +0000197
198 Not that calling any method (even inquiries) on a closed file is
199 undefined. Implementations may raise IOError in this case.
Guido van Rossum17e43e52007-02-27 15:45:13 +0000200 """
201
Guido van Rossum141f7672007-04-10 00:22:16 +0000202 ### Internal ###
203
204 def _unsupported(self, name: str) -> IOError:
205 """Internal: raise an exception for unsupported operations."""
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000206 raise UnsupportedOperation("%s.%s() not supported" %
207 (self.__class__.__name__, name))
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000208
Guido van Rossum141f7672007-04-10 00:22:16 +0000209 ### Positioning ###
210
Guido van Rossum53807da2007-04-10 19:01:47 +0000211 def seek(self, pos: int, whence: int = 0) -> int:
212 """seek(pos: int, whence: int = 0) -> int. Change stream position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000213
214 Seek to byte offset pos relative to position indicated by whence:
215 0 Start of stream (the default). pos should be >= 0;
216 1 Current position - whence may be negative;
217 2 End of stream - whence usually negative.
Guido van Rossum53807da2007-04-10 19:01:47 +0000218 Returns the new absolute position.
Guido van Rossum141f7672007-04-10 00:22:16 +0000219 """
220 self._unsupported("seek")
221
222 def tell(self) -> int:
223 """tell() -> int. Return current stream position."""
Guido van Rossum53807da2007-04-10 19:01:47 +0000224 return self.seek(0, 1)
Guido van Rossum141f7672007-04-10 00:22:16 +0000225
Guido van Rossum87429772007-04-10 21:06:59 +0000226 def truncate(self, pos: int = None) -> int:
227 """truncate(size: int = None) -> int. Truncate file to size bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000228
229 Size defaults to the current IO position as reported by tell().
Guido van Rossum87429772007-04-10 21:06:59 +0000230 Returns the new size.
Guido van Rossum141f7672007-04-10 00:22:16 +0000231 """
232 self._unsupported("truncate")
233
234 ### Flush and close ###
235
236 def flush(self) -> None:
237 """flush() -> None. Flushes write buffers, if applicable.
238
239 This is a no-op for read-only and non-blocking streams.
240 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000241 # XXX Should this return the number of bytes written???
Guido van Rossum141f7672007-04-10 00:22:16 +0000242
243 __closed = False
244
245 def close(self) -> None:
246 """close() -> None. Flushes and closes the IO object.
247
248 This must be idempotent. It should also set a flag for the
249 'closed' property (see below) to test.
250 """
251 if not self.__closed:
Guido van Rossum469734b2007-07-10 12:00:45 +0000252 try:
253 self.flush()
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000254 except IOError:
255 pass # If flush() fails, just give up
256 self.__closed = True
Guido van Rossum141f7672007-04-10 00:22:16 +0000257
258 def __del__(self) -> None:
259 """Destructor. Calls close()."""
260 # The try/except block is in case this is called at program
261 # exit time, when it's possible that globals have already been
262 # deleted, and then the close() call might fail. Since
263 # there's nothing we can do about such failures and they annoy
264 # the end users, we suppress the traceback.
265 try:
266 self.close()
267 except:
268 pass
269
270 ### Inquiries ###
271
272 def seekable(self) -> bool:
273 """seekable() -> bool. Return whether object supports random access.
274
275 If False, seek(), tell() and truncate() will raise IOError.
276 This method may need to do a test seek().
277 """
278 return False
279
Guido van Rossum5abbf752007-08-27 17:39:33 +0000280 def _checkSeekable(self, msg=None):
281 """Internal: raise an IOError if file is not seekable
282 """
283 if not self.seekable():
284 raise IOError("File or stream is not seekable."
285 if msg is None else msg)
286
287
Guido van Rossum141f7672007-04-10 00:22:16 +0000288 def readable(self) -> bool:
289 """readable() -> bool. Return whether object was opened for reading.
290
291 If False, read() will raise IOError.
292 """
293 return False
294
Guido van Rossum5abbf752007-08-27 17:39:33 +0000295 def _checkReadable(self, msg=None):
296 """Internal: raise an IOError if file is not readable
297 """
298 if not self.readable():
299 raise IOError("File or stream is not readable."
300 if msg is None else msg)
301
Guido van Rossum141f7672007-04-10 00:22:16 +0000302 def writable(self) -> bool:
303 """writable() -> bool. Return whether object was opened for writing.
304
305 If False, write() and truncate() will raise IOError.
306 """
307 return False
308
Guido van Rossum5abbf752007-08-27 17:39:33 +0000309 def _checkWritable(self, msg=None):
310 """Internal: raise an IOError if file is not writable
311 """
312 if not self.writable():
313 raise IOError("File or stream is not writable."
314 if msg is None else msg)
315
Guido van Rossum141f7672007-04-10 00:22:16 +0000316 @property
317 def closed(self):
318 """closed: bool. True iff the file has been closed.
319
320 For backwards compatibility, this is a property, not a predicate.
321 """
322 return self.__closed
323
Guido van Rossum5abbf752007-08-27 17:39:33 +0000324 def _checkClosed(self, msg=None):
325 """Internal: raise an ValueError if file is closed
326 """
327 if self.closed:
328 raise ValueError("I/O operation on closed file."
329 if msg is None else msg)
330
Guido van Rossum141f7672007-04-10 00:22:16 +0000331 ### Context manager ###
332
333 def __enter__(self) -> "IOBase": # That's a forward reference
334 """Context management protocol. Returns self."""
335 return self
336
337 def __exit__(self, *args) -> None:
338 """Context management protocol. Calls close()"""
339 self.close()
340
341 ### Lower-level APIs ###
342
343 # XXX Should these be present even if unimplemented?
344
345 def fileno(self) -> int:
346 """fileno() -> int. Returns underlying file descriptor if one exists.
347
348 Raises IOError if the IO object does not use a file descriptor.
349 """
350 self._unsupported("fileno")
351
352 def isatty(self) -> bool:
353 """isatty() -> int. Returns whether this is an 'interactive' stream.
354
355 Returns False if we don't know.
356 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000357 self._checkClosed()
Guido van Rossum141f7672007-04-10 00:22:16 +0000358 return False
359
Guido van Rossum7165cb12007-07-10 06:54:34 +0000360 ### Readline[s] and writelines ###
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000361
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000362 def readline(self, limit: int = -1) -> bytes:
363 """For backwards compatibility, a (slowish) readline()."""
Guido van Rossum2bf71382007-06-08 00:07:57 +0000364 if hasattr(self, "peek"):
365 def nreadahead():
366 readahead = self.peek(1, unsafe=True)
367 if not readahead:
368 return 1
369 n = (readahead.find(b"\n") + 1) or len(readahead)
370 if limit >= 0:
371 n = min(n, limit)
372 return n
373 else:
374 def nreadahead():
375 return 1
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000376 if limit is None:
377 limit = -1
378 res = bytes()
379 while limit < 0 or len(res) < limit:
Guido van Rossum2bf71382007-06-08 00:07:57 +0000380 b = self.read(nreadahead())
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000381 if not b:
382 break
383 res += b
Guido van Rossum48fc58a2007-06-07 23:45:37 +0000384 if res.endswith(b"\n"):
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000385 break
386 return res
387
Guido van Rossum7165cb12007-07-10 06:54:34 +0000388 def __iter__(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000389 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000390 return self
391
392 def __next__(self):
393 line = self.readline()
394 if not line:
395 raise StopIteration
396 return line
397
398 def readlines(self, hint=None):
399 if hint is None:
400 return list(self)
401 n = 0
402 lines = []
403 for line in self:
404 lines.append(line)
405 n += len(line)
406 if n >= hint:
407 break
408 return lines
409
410 def writelines(self, lines):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000411 self._checkClosed()
Guido van Rossum7165cb12007-07-10 06:54:34 +0000412 for line in lines:
413 self.write(line)
414
Guido van Rossum141f7672007-04-10 00:22:16 +0000415
416class RawIOBase(IOBase):
417
418 """Base class for raw binary I/O.
419
420 The read() method is implemented by calling readinto(); derived
421 classes that want to support read() only need to implement
422 readinto() as a primitive operation. In general, readinto()
423 can be more efficient than read().
424
425 (It would be tempting to also provide an implementation of
426 readinto() in terms of read(), in case the latter is a more
427 suitable primitive operation, but that would lead to nasty
428 recursion in case a subclass doesn't implement either.)
429 """
430
Guido van Rossum7165cb12007-07-10 06:54:34 +0000431 def read(self, n: int = -1) -> bytes:
Guido van Rossum78892e42007-04-06 17:31:18 +0000432 """read(n: int) -> bytes. Read and return up to n bytes.
Guido van Rossum01a27522007-03-07 01:00:12 +0000433
434 Returns an empty bytes array on EOF, or None if the object is
435 set not to block and has no data to read.
436 """
Guido van Rossum7165cb12007-07-10 06:54:34 +0000437 if n is None:
438 n = -1
439 if n < 0:
440 return self.readall()
Guido van Rossum28524c72007-02-27 05:47:44 +0000441 b = bytes(n.__index__())
Guido van Rossum00efead2007-03-07 05:23:25 +0000442 n = self.readinto(b)
443 del b[n:]
Guido van Rossum28524c72007-02-27 05:47:44 +0000444 return b
445
Guido van Rossum7165cb12007-07-10 06:54:34 +0000446 def readall(self):
447 """readall() -> bytes. Read until EOF, using multiple read() call."""
448 res = bytes()
449 while True:
450 data = self.read(DEFAULT_BUFFER_SIZE)
451 if not data:
452 break
453 res += data
454 return res
455
Guido van Rossum141f7672007-04-10 00:22:16 +0000456 def readinto(self, b: bytes) -> int:
457 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
Guido van Rossum78892e42007-04-06 17:31:18 +0000458
459 Returns number of bytes read (0 for EOF), or None if the object
460 is set not to block as has no data to read.
461 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000462 self._unsupported("readinto")
Guido van Rossum28524c72007-02-27 05:47:44 +0000463
Guido van Rossum141f7672007-04-10 00:22:16 +0000464 def write(self, b: bytes) -> int:
Guido van Rossum78892e42007-04-06 17:31:18 +0000465 """write(b: bytes) -> int. Write the given buffer to the IO stream.
Guido van Rossum01a27522007-03-07 01:00:12 +0000466
Guido van Rossum78892e42007-04-06 17:31:18 +0000467 Returns the number of bytes written, which may be less than len(b).
Guido van Rossum01a27522007-03-07 01:00:12 +0000468 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000469 self._unsupported("write")
Guido van Rossum28524c72007-02-27 05:47:44 +0000470
Guido van Rossum78892e42007-04-06 17:31:18 +0000471
Guido van Rossum141f7672007-04-10 00:22:16 +0000472class FileIO(_fileio._FileIO, RawIOBase):
Guido van Rossum28524c72007-02-27 05:47:44 +0000473
Guido van Rossum141f7672007-04-10 00:22:16 +0000474 """Raw I/O implementation for OS files.
Guido van Rossum28524c72007-02-27 05:47:44 +0000475
Guido van Rossum141f7672007-04-10 00:22:16 +0000476 This multiply inherits from _FileIO and RawIOBase to make
477 isinstance(io.FileIO(), io.RawIOBase) return True without
478 requiring that _fileio._FileIO inherits from io.RawIOBase (which
479 would be hard to do since _fileio.c is written in C).
480 """
Guido van Rossuma9e20242007-03-08 00:43:48 +0000481
Guido van Rossum87429772007-04-10 21:06:59 +0000482 def close(self):
483 _fileio._FileIO.close(self)
484 RawIOBase.close(self)
485
Guido van Rossum13633bb2007-04-13 18:42:35 +0000486 @property
487 def name(self):
488 return self._name
489
490 @property
491 def mode(self):
492 return self._mode
493
Guido van Rossuma9e20242007-03-08 00:43:48 +0000494
Guido van Rossumcce92b22007-04-10 14:41:39 +0000495class BufferedIOBase(IOBase):
Guido van Rossum141f7672007-04-10 00:22:16 +0000496
497 """Base class for buffered IO objects.
498
499 The main difference with RawIOBase is that the read() method
500 supports omitting the size argument, and does not have a default
501 implementation that defers to readinto().
502
503 In addition, read(), readinto() and write() may raise
504 BlockingIOError if the underlying raw stream is in non-blocking
505 mode and not ready; unlike their raw counterparts, they will never
506 return None.
507
508 A typical implementation should not inherit from a RawIOBase
509 implementation, but wrap one.
510 """
511
Guido van Rossumc2f93dc2007-05-24 00:50:02 +0000512 def read(self, n: int = None) -> bytes:
513 """read(n: int = None) -> bytes. Read and return up to n bytes.
Guido van Rossum141f7672007-04-10 00:22:16 +0000514
Guido van Rossum024da5c2007-05-17 23:59:11 +0000515 If the argument is omitted, None, or negative, reads and
516 returns all data until EOF.
Guido van Rossum141f7672007-04-10 00:22:16 +0000517
518 If the argument is positive, and the underlying raw stream is
519 not 'interactive', multiple raw reads may be issued to satisfy
520 the byte count (unless EOF is reached first). But for
521 interactive raw streams (XXX and for pipes?), at most one raw
522 read will be issued, and a short result does not imply that
523 EOF is imminent.
524
525 Returns an empty bytes array on EOF.
526
527 Raises BlockingIOError if the underlying raw stream has no
528 data at the moment.
529 """
530 self._unsupported("read")
531
532 def readinto(self, b: bytes) -> int:
533 """readinto(b: bytes) -> int. Read up to len(b) bytes into b.
534
535 Like read(), this may issue multiple reads to the underlying
536 raw stream, unless the latter is 'interactive' (XXX or a
537 pipe?).
538
539 Returns the number of bytes read (0 for EOF).
540
541 Raises BlockingIOError if the underlying raw stream has no
542 data at the moment.
543 """
Guido van Rossumd4103952007-04-12 05:44:49 +0000544 # XXX This ought to work with anything that supports the buffer API
Guido van Rossum87429772007-04-10 21:06:59 +0000545 data = self.read(len(b))
546 n = len(data)
Guido van Rossum7165cb12007-07-10 06:54:34 +0000547 try:
548 b[:n] = data
549 except TypeError as err:
550 import array
551 if not isinstance(b, array.array):
552 raise err
553 b[:n] = array.array('b', data)
Guido van Rossum87429772007-04-10 21:06:59 +0000554 return n
Guido van Rossum141f7672007-04-10 00:22:16 +0000555
556 def write(self, b: bytes) -> int:
557 """write(b: bytes) -> int. Write the given buffer to the IO stream.
558
559 Returns the number of bytes written, which is never less than
560 len(b).
561
562 Raises BlockingIOError if the buffer is full and the
563 underlying raw stream cannot accept more data at the moment.
564 """
565 self._unsupported("write")
566
567
568class _BufferedIOMixin(BufferedIOBase):
569
570 """A mixin implementation of BufferedIOBase with an underlying raw stream.
571
572 This passes most requests on to the underlying raw stream. It
573 does *not* provide implementations of read(), readinto() or
574 write().
575 """
576
577 def __init__(self, raw):
578 self.raw = raw
579
580 ### Positioning ###
581
582 def seek(self, pos, whence=0):
Guido van Rossum53807da2007-04-10 19:01:47 +0000583 return self.raw.seek(pos, whence)
Guido van Rossum141f7672007-04-10 00:22:16 +0000584
585 def tell(self):
586 return self.raw.tell()
587
588 def truncate(self, pos=None):
Guido van Rossum7165cb12007-07-10 06:54:34 +0000589 if pos is None:
590 pos = self.tell()
Guido van Rossum87429772007-04-10 21:06:59 +0000591 return self.raw.truncate(pos)
Guido van Rossum141f7672007-04-10 00:22:16 +0000592
593 ### Flush and close ###
594
595 def flush(self):
596 self.raw.flush()
597
598 def close(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000599 if not self.closed:
Guido van Rossum33e7a8e2007-07-22 20:38:07 +0000600 try:
601 self.flush()
602 except IOError:
603 pass # If flush() fails, just give up
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000604 self.raw.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000605
606 ### Inquiries ###
607
608 def seekable(self):
609 return self.raw.seekable()
610
611 def readable(self):
612 return self.raw.readable()
613
614 def writable(self):
615 return self.raw.writable()
616
617 @property
618 def closed(self):
619 return self.raw.closed
620
621 ### Lower-level APIs ###
622
623 def fileno(self):
624 return self.raw.fileno()
625
626 def isatty(self):
627 return self.raw.isatty()
628
629
Guido van Rossum024da5c2007-05-17 23:59:11 +0000630class BytesIO(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000631
Guido van Rossum024da5c2007-05-17 23:59:11 +0000632 """Buffered I/O implementation using an in-memory bytes buffer."""
Guido van Rossum28524c72007-02-27 05:47:44 +0000633
Guido van Rossum024da5c2007-05-17 23:59:11 +0000634 # XXX More docs
635
636 def __init__(self, initial_bytes=None):
637 buffer = b""
638 if initial_bytes is not None:
639 buffer += initial_bytes
Guido van Rossum78892e42007-04-06 17:31:18 +0000640 self._buffer = buffer
Guido van Rossum28524c72007-02-27 05:47:44 +0000641 self._pos = 0
Guido van Rossum28524c72007-02-27 05:47:44 +0000642
643 def getvalue(self):
644 return self._buffer
645
Guido van Rossum024da5c2007-05-17 23:59:11 +0000646 def read(self, n=None):
647 if n is None:
648 n = -1
Guido van Rossum141f7672007-04-10 00:22:16 +0000649 if n < 0:
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000650 n = len(self._buffer)
Guido van Rossum28524c72007-02-27 05:47:44 +0000651 newpos = min(len(self._buffer), self._pos + n)
652 b = self._buffer[self._pos : newpos]
653 self._pos = newpos
654 return b
655
Guido van Rossum024da5c2007-05-17 23:59:11 +0000656 def read1(self, n):
657 return self.read(n)
658
Guido van Rossum28524c72007-02-27 05:47:44 +0000659 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000660 if self.closed:
661 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000662 if isinstance(b, str):
663 raise TypeError("can't write str to binary stream")
Guido van Rossum28524c72007-02-27 05:47:44 +0000664 n = len(b)
665 newpos = self._pos + n
Guido van Rossumb972a782007-07-21 00:25:15 +0000666 if newpos > len(self._buffer):
667 # Inserts null bytes between the current end of the file
668 # and the new write position.
Guido van Rossuma74184e2007-08-29 04:05:57 +0000669 padding = b'\x00' * (newpos - len(self._buffer) - n)
Guido van Rossumb972a782007-07-21 00:25:15 +0000670 self._buffer[self._pos:newpos - n] = padding
Guido van Rossum28524c72007-02-27 05:47:44 +0000671 self._buffer[self._pos:newpos] = b
672 self._pos = newpos
673 return n
674
675 def seek(self, pos, whence=0):
676 if whence == 0:
677 self._pos = max(0, pos)
678 elif whence == 1:
679 self._pos = max(0, self._pos + pos)
680 elif whence == 2:
681 self._pos = max(0, len(self._buffer) + pos)
682 else:
683 raise IOError("invalid whence value")
Guido van Rossum53807da2007-04-10 19:01:47 +0000684 return self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000685
686 def tell(self):
687 return self._pos
688
689 def truncate(self, pos=None):
690 if pos is None:
691 pos = self._pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000692 del self._buffer[pos:]
Guido van Rossum87429772007-04-10 21:06:59 +0000693 return pos
Guido van Rossum28524c72007-02-27 05:47:44 +0000694
695 def readable(self):
696 return True
697
698 def writable(self):
699 return True
700
701 def seekable(self):
702 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000703
704
Guido van Rossum141f7672007-04-10 00:22:16 +0000705class BufferedReader(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000706
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000707 """Buffer for a readable sequential RawIO object."""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000708
Guido van Rossum78892e42007-04-06 17:31:18 +0000709 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
Guido van Rossum01a27522007-03-07 01:00:12 +0000710 """Create a new buffered reader using the given readable raw IO object.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000711 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000712 raw._checkReadable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000713 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum01a27522007-03-07 01:00:12 +0000714 self._read_buf = b""
Guido van Rossum78892e42007-04-06 17:31:18 +0000715 self.buffer_size = buffer_size
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000716
Guido van Rossum024da5c2007-05-17 23:59:11 +0000717 def read(self, n=None):
Guido van Rossum01a27522007-03-07 01:00:12 +0000718 """Read n bytes.
719
720 Returns exactly n bytes of data unless the underlying raw IO
Walter Dörwalda3270002007-05-29 19:13:29 +0000721 stream reaches EOF or if the call would block in non-blocking
Guido van Rossum141f7672007-04-10 00:22:16 +0000722 mode. If n is negative, read until EOF or until read() would
Guido van Rossum01a27522007-03-07 01:00:12 +0000723 block.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000724 """
Guido van Rossum024da5c2007-05-17 23:59:11 +0000725 if n is None:
726 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +0000727 nodata_val = b""
Guido van Rossum141f7672007-04-10 00:22:16 +0000728 while n < 0 or len(self._read_buf) < n:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000729 to_read = max(self.buffer_size,
730 n if n is not None else 2*len(self._read_buf))
Guido van Rossum78892e42007-04-06 17:31:18 +0000731 current = self.raw.read(to_read)
Guido van Rossum78892e42007-04-06 17:31:18 +0000732 if current in (b"", None):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000733 nodata_val = current
734 break
Guido van Rossum01a27522007-03-07 01:00:12 +0000735 self._read_buf += current
736 if self._read_buf:
Guido van Rossum141f7672007-04-10 00:22:16 +0000737 if n < 0:
Guido van Rossum01a27522007-03-07 01:00:12 +0000738 n = len(self._read_buf)
739 out = self._read_buf[:n]
740 self._read_buf = self._read_buf[n:]
741 else:
742 out = nodata_val
743 return out
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000744
Guido van Rossum13633bb2007-04-13 18:42:35 +0000745 def peek(self, n=0, *, unsafe=False):
746 """Returns buffered bytes without advancing the position.
747
748 The argument indicates a desired minimal number of bytes; we
749 do at most one raw read to satisfy it. We never return more
750 than self.buffer_size.
751
752 Unless unsafe=True is passed, we return a copy.
753 """
754 want = min(n, self.buffer_size)
755 have = len(self._read_buf)
756 if have < want:
757 to_read = self.buffer_size - have
758 current = self.raw.read(to_read)
759 if current:
760 self._read_buf += current
761 result = self._read_buf
762 if unsafe:
763 result = result[:]
764 return result
765
766 def read1(self, n):
767 """Reads up to n bytes.
768
769 Returns up to n bytes. If at least one byte is buffered,
770 we only return buffered bytes. Otherwise, we do one
771 raw read.
772 """
773 if n <= 0:
774 return b""
775 self.peek(1, unsafe=True)
776 return self.read(min(n, len(self._read_buf)))
777
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000778 def tell(self):
779 return self.raw.tell() - len(self._read_buf)
780
781 def seek(self, pos, whence=0):
782 if whence == 1:
783 pos -= len(self._read_buf)
Guido van Rossum53807da2007-04-10 19:01:47 +0000784 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000785 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000786 return pos
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000787
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000788
Guido van Rossum141f7672007-04-10 00:22:16 +0000789class BufferedWriter(_BufferedIOMixin):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000790
Guido van Rossum78892e42007-04-06 17:31:18 +0000791 # XXX docstring
792
Guido van Rossum141f7672007-04-10 00:22:16 +0000793 def __init__(self, raw,
794 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000795 raw._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000796 _BufferedIOMixin.__init__(self, raw)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000797 self.buffer_size = buffer_size
Guido van Rossum141f7672007-04-10 00:22:16 +0000798 self.max_buffer_size = (2*buffer_size
799 if max_buffer_size is None
800 else max_buffer_size)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000801 self._write_buf = b""
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000802
803 def write(self, b):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000804 if self.closed:
805 raise ValueError("write to closed file")
Guido van Rossuma74184e2007-08-29 04:05:57 +0000806 if isinstance(b, str):
807 raise TypeError("can't write str to binary stream")
Guido van Rossum01a27522007-03-07 01:00:12 +0000808 # XXX we can implement some more tricks to try and avoid partial writes
Guido van Rossum01a27522007-03-07 01:00:12 +0000809 if len(self._write_buf) > self.buffer_size:
810 # We're full, so let's pre-flush the buffer
811 try:
812 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000813 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000814 # We can't accept anything else.
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000815 # XXX Why not just let the exception pass through?
Guido van Rossum141f7672007-04-10 00:22:16 +0000816 raise BlockingIOError(e.errno, e.strerror, 0)
Guido van Rossumd4103952007-04-12 05:44:49 +0000817 before = len(self._write_buf)
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000818 self._write_buf.extend(b)
Guido van Rossumd4103952007-04-12 05:44:49 +0000819 written = len(self._write_buf) - before
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000820 if len(self._write_buf) > self.buffer_size:
Guido van Rossum01a27522007-03-07 01:00:12 +0000821 try:
822 self.flush()
Guido van Rossum141f7672007-04-10 00:22:16 +0000823 except BlockingIOError as e:
Guido van Rossum01a27522007-03-07 01:00:12 +0000824 if (len(self._write_buf) > self.max_buffer_size):
825 # We've hit max_buffer_size. We have to accept a partial
826 # write and cut back our buffer.
827 overage = len(self._write_buf) - self.max_buffer_size
828 self._write_buf = self._write_buf[:self.max_buffer_size]
Guido van Rossum141f7672007-04-10 00:22:16 +0000829 raise BlockingIOError(e.errno, e.strerror, overage)
Guido van Rossumd4103952007-04-12 05:44:49 +0000830 return written
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000831
832 def flush(self):
Guido van Rossum4b5386f2007-07-10 09:12:49 +0000833 if self.closed:
834 raise ValueError("flush of closed file")
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000835 written = 0
Guido van Rossum01a27522007-03-07 01:00:12 +0000836 try:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000837 while self._write_buf:
838 n = self.raw.write(self._write_buf)
839 del self._write_buf[:n]
840 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000841 except BlockingIOError as e:
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000842 n = e.characters_written
843 del self._write_buf[:n]
844 written += n
Guido van Rossum141f7672007-04-10 00:22:16 +0000845 raise BlockingIOError(e.errno, e.strerror, written)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000846
847 def tell(self):
848 return self.raw.tell() + len(self._write_buf)
849
850 def seek(self, pos, whence=0):
851 self.flush()
Guido van Rossum53807da2007-04-10 19:01:47 +0000852 return self.raw.seek(pos, whence)
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000853
Guido van Rossum01a27522007-03-07 01:00:12 +0000854
Guido van Rossum141f7672007-04-10 00:22:16 +0000855class BufferedRWPair(BufferedIOBase):
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000856
Guido van Rossum01a27522007-03-07 01:00:12 +0000857 """A buffered reader and writer object together.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000858
Guido van Rossum141f7672007-04-10 00:22:16 +0000859 A buffered reader object and buffered writer object put together
860 to form a sequential IO object that can read and write.
Guido van Rossum78892e42007-04-06 17:31:18 +0000861
862 This is typically used with a socket or two-way pipe.
Guido van Rossum141f7672007-04-10 00:22:16 +0000863
864 XXX The usefulness of this (compared to having two separate IO
865 objects) is questionable.
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000866 """
867
Guido van Rossum141f7672007-04-10 00:22:16 +0000868 def __init__(self, reader, writer,
869 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
870 """Constructor.
871
872 The arguments are two RawIO instances.
873 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000874 reader._checkReadable()
875 writer._checkWritable()
Guido van Rossum141f7672007-04-10 00:22:16 +0000876 self.reader = BufferedReader(reader, buffer_size)
877 self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000878
Guido van Rossum024da5c2007-05-17 23:59:11 +0000879 def read(self, n=None):
880 if n is None:
881 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000882 return self.reader.read(n)
883
Guido van Rossum141f7672007-04-10 00:22:16 +0000884 def readinto(self, b):
885 return self.reader.readinto(b)
886
Guido van Rossum01a27522007-03-07 01:00:12 +0000887 def write(self, b):
888 return self.writer.write(b)
889
Guido van Rossum13633bb2007-04-13 18:42:35 +0000890 def peek(self, n=0, *, unsafe=False):
891 return self.reader.peek(n, unsafe=unsafe)
892
893 def read1(self, n):
894 return self.reader.read1(n)
895
Guido van Rossum01a27522007-03-07 01:00:12 +0000896 def readable(self):
897 return self.reader.readable()
898
899 def writable(self):
900 return self.writer.writable()
901
902 def flush(self):
903 return self.writer.flush()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000904
Guido van Rossum01a27522007-03-07 01:00:12 +0000905 def close(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000906 self.writer.close()
Guido van Rossum141f7672007-04-10 00:22:16 +0000907 self.reader.close()
908
909 def isatty(self):
910 return self.reader.isatty() or self.writer.isatty()
Guido van Rossum01a27522007-03-07 01:00:12 +0000911
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000912 @property
913 def closed(self):
Guido van Rossum141f7672007-04-10 00:22:16 +0000914 return self.writer.closed()
Guido van Rossum01a27522007-03-07 01:00:12 +0000915
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000916
Guido van Rossum141f7672007-04-10 00:22:16 +0000917class BufferedRandom(BufferedWriter, BufferedReader):
Guido van Rossum01a27522007-03-07 01:00:12 +0000918
Guido van Rossum78892e42007-04-06 17:31:18 +0000919 # XXX docstring
920
Guido van Rossum141f7672007-04-10 00:22:16 +0000921 def __init__(self, raw,
922 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000923 raw._checkSeekable()
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000924 BufferedReader.__init__(self, raw, buffer_size)
Guido van Rossum01a27522007-03-07 01:00:12 +0000925 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size)
926
Guido van Rossum01a27522007-03-07 01:00:12 +0000927 def seek(self, pos, whence=0):
928 self.flush()
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000929 # First do the raw seek, then empty the read buffer, so that
930 # if the raw seek fails, we don't lose buffered data forever.
Guido van Rossum53807da2007-04-10 19:01:47 +0000931 pos = self.raw.seek(pos, whence)
Guido van Rossum76c5d4d2007-04-06 19:10:29 +0000932 self._read_buf = b""
Guido van Rossum53807da2007-04-10 19:01:47 +0000933 return pos
Guido van Rossum01a27522007-03-07 01:00:12 +0000934
935 def tell(self):
936 if (self._write_buf):
937 return self.raw.tell() + len(self._write_buf)
938 else:
939 return self.raw.tell() - len(self._read_buf)
940
Guido van Rossum024da5c2007-05-17 23:59:11 +0000941 def read(self, n=None):
942 if n is None:
943 n = -1
Guido van Rossum01a27522007-03-07 01:00:12 +0000944 self.flush()
945 return BufferedReader.read(self, n)
946
Guido van Rossum141f7672007-04-10 00:22:16 +0000947 def readinto(self, b):
948 self.flush()
949 return BufferedReader.readinto(self, b)
950
Guido van Rossum13633bb2007-04-13 18:42:35 +0000951 def peek(self, n=0, *, unsafe=False):
952 self.flush()
953 return BufferedReader.peek(self, n, unsafe=unsafe)
954
955 def read1(self, n):
956 self.flush()
957 return BufferedReader.read1(self, n)
958
Guido van Rossum01a27522007-03-07 01:00:12 +0000959 def write(self, b):
Guido van Rossum78892e42007-04-06 17:31:18 +0000960 if self._read_buf:
961 self.raw.seek(-len(self._read_buf), 1) # Undo readahead
962 self._read_buf = b""
Guido van Rossum01a27522007-03-07 01:00:12 +0000963 return BufferedWriter.write(self, b)
964
Guido van Rossum78892e42007-04-06 17:31:18 +0000965
Guido van Rossumcce92b22007-04-10 14:41:39 +0000966class TextIOBase(IOBase):
Guido van Rossum78892e42007-04-06 17:31:18 +0000967
968 """Base class for text I/O.
969
970 This class provides a character and line based interface to stream I/O.
Guido van Rossum9b76da62007-04-11 01:09:03 +0000971
972 There is no readinto() method, as character strings are immutable.
Guido van Rossum78892e42007-04-06 17:31:18 +0000973 """
974
975 def read(self, n: int = -1) -> str:
976 """read(n: int = -1) -> str. Read at most n characters from stream.
977
978 Read from underlying buffer until we have n characters or we hit EOF.
979 If n is negative or omitted, read until EOF.
980 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000981 self._unsupported("read")
Guido van Rossum78892e42007-04-06 17:31:18 +0000982
Guido van Rossum9b76da62007-04-11 01:09:03 +0000983 def write(self, s: str) -> int:
984 """write(s: str) -> int. Write string s to stream."""
Guido van Rossum4f0db6e2007-04-08 23:59:06 +0000985 self._unsupported("write")
Guido van Rossum78892e42007-04-06 17:31:18 +0000986
Guido van Rossum9b76da62007-04-11 01:09:03 +0000987 def truncate(self, pos: int = None) -> int:
988 """truncate(pos: int = None) -> int. Truncate size to pos."""
989 self.flush()
990 if pos is None:
991 pos = self.tell()
992 self.seek(pos)
993 return self.buffer.truncate()
994
Guido van Rossum78892e42007-04-06 17:31:18 +0000995 def readline(self) -> str:
996 """readline() -> str. Read until newline or EOF.
997
998 Returns an empty string if EOF is hit immediately.
999 """
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001000 self._unsupported("readline")
Guido van Rossum78892e42007-04-06 17:31:18 +00001001
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001002 @property
1003 def encoding(self):
1004 """Subclasses should override."""
1005 return None
1006
Guido van Rossum8358db22007-08-18 21:39:55 +00001007 @property
1008 def newlines(self):
1009 """newlines -> None | str | tuple of str. Line endings translated
1010 so far.
1011
1012 Only line endings translated during reading are considered.
1013
1014 Subclasses should override.
1015 """
1016 return None
1017
Guido van Rossum78892e42007-04-06 17:31:18 +00001018
1019class TextIOWrapper(TextIOBase):
1020
1021 """Buffered text stream.
1022
1023 Character and line based layer over a BufferedIOBase object.
1024 """
1025
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001026 _CHUNK_SIZE = 128
Guido van Rossum78892e42007-04-06 17:31:18 +00001027
1028 def __init__(self, buffer, encoding=None, newline=None):
Guido van Rossum8358db22007-08-18 21:39:55 +00001029 if newline not in (None, "", "\n", "\r", "\r\n"):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001030 raise ValueError("illegal newline value: %r" % (newline,))
Guido van Rossum78892e42007-04-06 17:31:18 +00001031 if encoding is None:
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001032 try:
1033 encoding = os.device_encoding(buffer.fileno())
Neal Norwitz1e50a9f2007-08-11 18:37:05 +00001034 except (AttributeError, io.UnsupportedOperation):
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00001035 pass
1036 if encoding is None:
Martin v. Löwisd78d3b42007-08-11 15:36:45 +00001037 try:
1038 import locale
1039 except ImportError:
1040 # Importing locale may fail if Python is being built
1041 encoding = "ascii"
1042 else:
1043 encoding = locale.getpreferredencoding()
Guido van Rossum78892e42007-04-06 17:31:18 +00001044
1045 self.buffer = buffer
1046 self._encoding = encoding
Guido van Rossum8358db22007-08-18 21:39:55 +00001047 self._readuniversal = not newline
1048 self._readtranslate = newline is None
1049 self._readnl = newline
1050 self._writetranslate = newline != ''
1051 self._writenl = newline or os.linesep
1052 self._seennl = 0
Guido van Rossum78892e42007-04-06 17:31:18 +00001053 self._decoder = None
Guido van Rossum9b76da62007-04-11 01:09:03 +00001054 self._pending = ""
1055 self._snapshot = None
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001056 self._seekable = self._telling = self.buffer.seekable()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001057
Guido van Rossumfc3436b2007-05-24 17:58:06 +00001058 @property
1059 def encoding(self):
1060 return self._encoding
1061
Guido van Rossum9b76da62007-04-11 01:09:03 +00001062 # A word about _snapshot. This attribute is either None, or a
Guido van Rossumd76e7792007-04-17 02:38:04 +00001063 # tuple (decoder_state, readahead, pending) where decoder_state is
1064 # the second (integer) item of the decoder state, readahead is the
1065 # chunk of bytes that was read, and pending is the characters that
1066 # were rendered by the decoder after feeding it those bytes. We
1067 # use this to reconstruct intermediate decoder states in tell().
Guido van Rossum9b76da62007-04-11 01:09:03 +00001068
1069 def _seekable(self):
1070 return self._seekable
Guido van Rossum78892e42007-04-06 17:31:18 +00001071
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001072 def flush(self):
1073 self.buffer.flush()
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001074 self._telling = self._seekable
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001075
1076 def close(self):
Guido van Rossum33e7a8e2007-07-22 20:38:07 +00001077 try:
1078 self.flush()
1079 except:
1080 pass # If flush() fails, just give up
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001081 self.buffer.close()
1082
1083 @property
1084 def closed(self):
1085 return self.buffer.closed
1086
Guido van Rossum9be55972007-04-07 02:59:27 +00001087 def fileno(self):
1088 return self.buffer.fileno()
1089
Guido van Rossum859b5ec2007-05-27 09:14:51 +00001090 def isatty(self):
1091 return self.buffer.isatty()
1092
Guido van Rossum78892e42007-04-06 17:31:18 +00001093 def write(self, s: str):
Guido van Rossum4b5386f2007-07-10 09:12:49 +00001094 if self.closed:
1095 raise ValueError("write to closed file")
Guido van Rossumdcce8392007-08-29 18:10:08 +00001096 if not isinstance(s, basestring):
1097 raise TypeError("can't write %s to text stream" %
1098 s.__class__.__name__)
Guido van Rossum8358db22007-08-18 21:39:55 +00001099 haslf = "\n" in s
1100 if haslf and self._writetranslate and self._writenl != "\n":
1101 s = s.replace("\n", self._writenl)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001102 # XXX What if we were just reading?
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001103 b = s.encode(self._encoding)
Guido van Rossum8358db22007-08-18 21:39:55 +00001104 self.buffer.write(b)
1105 if haslf and self.isatty():
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001106 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001107 self._snapshot = self._decoder = None
1108 return len(s)
Guido van Rossum78892e42007-04-06 17:31:18 +00001109
1110 def _get_decoder(self):
1111 make_decoder = codecs.getincrementaldecoder(self._encoding)
1112 if make_decoder is None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001113 raise IOError("Can't find an incremental decoder for encoding %s" %
Guido van Rossum78892e42007-04-06 17:31:18 +00001114 self._encoding)
1115 decoder = self._decoder = make_decoder() # XXX: errors
Guido van Rossum78892e42007-04-06 17:31:18 +00001116 return decoder
1117
Guido van Rossum9b76da62007-04-11 01:09:03 +00001118 def _read_chunk(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +00001119 if self._decoder is None:
1120 raise ValueError("no decoder")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001121 if not self._telling:
Guido van Rossum13633bb2007-04-13 18:42:35 +00001122 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001123 pending = self._decoder.decode(readahead, not readahead)
1124 return readahead, pending
Guido van Rossumd76e7792007-04-17 02:38:04 +00001125 decoder_buffer, decoder_state = self._decoder.getstate()
Guido van Rossum13633bb2007-04-13 18:42:35 +00001126 readahead = self.buffer.read1(self._CHUNK_SIZE)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001127 pending = self._decoder.decode(readahead, not readahead)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001128 self._snapshot = (decoder_state, decoder_buffer + readahead, pending)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001129 return readahead, pending
Guido van Rossum9b76da62007-04-11 01:09:03 +00001130
1131 def _encode_decoder_state(self, ds, pos):
Guido van Rossum9b76da62007-04-11 01:09:03 +00001132 x = 0
1133 for i in bytes(ds):
1134 x = x<<8 | i
1135 return (x<<64) | pos
1136
1137 def _decode_decoder_state(self, pos):
1138 x, pos = divmod(pos, 1<<64)
1139 if not x:
1140 return None, pos
1141 b = b""
1142 while x:
1143 b.append(x&0xff)
1144 x >>= 8
1145 return str(b[::-1]), pos
1146
1147 def tell(self):
1148 if not self._seekable:
1149 raise IOError("Underlying stream is not seekable")
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001150 if not self._telling:
1151 raise IOError("Telling position disabled by next() call")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001152 self.flush()
Guido van Rossumcba608c2007-04-11 14:19:59 +00001153 position = self.buffer.tell()
Guido van Rossumd76e7792007-04-17 02:38:04 +00001154 decoder = self._decoder
1155 if decoder is None or self._snapshot is None:
Guido van Rossum5abbf752007-08-27 17:39:33 +00001156 if self._pending:
1157 raise ValueError("pending data")
Guido van Rossumcba608c2007-04-11 14:19:59 +00001158 return position
1159 decoder_state, readahead, pending = self._snapshot
1160 position -= len(readahead)
1161 needed = len(pending) - len(self._pending)
1162 if not needed:
1163 return self._encode_decoder_state(decoder_state, position)
Guido van Rossumd76e7792007-04-17 02:38:04 +00001164 saved_state = decoder.getstate()
1165 try:
Guido van Rossum2b08b382007-05-08 20:18:39 +00001166 decoder.setstate((b"", decoder_state))
Guido van Rossumd76e7792007-04-17 02:38:04 +00001167 n = 0
1168 bb = bytes(1)
1169 for i, bb[0] in enumerate(readahead):
1170 n += len(decoder.decode(bb))
1171 if n >= needed:
1172 decoder_buffer, decoder_state = decoder.getstate()
1173 return self._encode_decoder_state(
1174 decoder_state,
1175 position + (i+1) - len(decoder_buffer))
1176 raise IOError("Can't reconstruct logical file position")
1177 finally:
1178 decoder.setstate(saved_state)
Guido van Rossum9b76da62007-04-11 01:09:03 +00001179
1180 def seek(self, pos, whence=0):
1181 if not self._seekable:
1182 raise IOError("Underlying stream is not seekable")
1183 if whence == 1:
1184 if pos != 0:
1185 raise IOError("Can't do nonzero cur-relative seeks")
Guido van Rossumaa43ed92007-04-12 05:24:24 +00001186 pos = self.tell()
1187 whence = 0
Guido van Rossum9b76da62007-04-11 01:09:03 +00001188 if whence == 2:
1189 if pos != 0:
1190 raise IOError("Can't do nonzero end-relative seeks")
1191 self.flush()
1192 pos = self.buffer.seek(0, 2)
1193 self._snapshot = None
1194 self._pending = ""
1195 self._decoder = None
1196 return pos
1197 if whence != 0:
1198 raise ValueError("Invalid whence (%r, should be 0, 1 or 2)" %
1199 (whence,))
1200 if pos < 0:
1201 raise ValueError("Negative seek position %r" % (pos,))
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001202 self.flush()
Guido van Rossum9b76da62007-04-11 01:09:03 +00001203 orig_pos = pos
1204 ds, pos = self._decode_decoder_state(pos)
1205 if not ds:
1206 self.buffer.seek(pos)
1207 self._snapshot = None
1208 self._pending = ""
1209 self._decoder = None
1210 return pos
Guido van Rossumd76e7792007-04-17 02:38:04 +00001211 decoder = self._decoder or self._get_decoder()
1212 decoder.set_state(("", ds))
Guido van Rossum9b76da62007-04-11 01:09:03 +00001213 self.buffer.seek(pos)
Guido van Rossumcba608c2007-04-11 14:19:59 +00001214 self._snapshot = (ds, b"", "")
Guido van Rossum9b76da62007-04-11 01:09:03 +00001215 self._pending = ""
Guido van Rossumcba608c2007-04-11 14:19:59 +00001216 self._decoder = decoder
Guido van Rossum9b76da62007-04-11 01:09:03 +00001217 return orig_pos
1218
Guido van Rossum024da5c2007-05-17 23:59:11 +00001219 def read(self, n=None):
1220 if n is None:
1221 n = -1
Guido van Rossum78892e42007-04-06 17:31:18 +00001222 decoder = self._decoder or self._get_decoder()
1223 res = self._pending
1224 if n < 0:
1225 res += decoder.decode(self.buffer.read(), True)
Guido van Rossum141f7672007-04-10 00:22:16 +00001226 self._pending = ""
Guido van Rossum9b76da62007-04-11 01:09:03 +00001227 self._snapshot = None
Guido van Rossum8358db22007-08-18 21:39:55 +00001228 return self._replacenl(res)
Guido van Rossum78892e42007-04-06 17:31:18 +00001229 else:
1230 while len(res) < n:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001231 readahead, pending = self._read_chunk()
1232 res += pending
1233 if not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001234 break
1235 self._pending = res[n:]
Guido van Rossum8358db22007-08-18 21:39:55 +00001236 return self._replacenl(res[:n])
Guido van Rossum78892e42007-04-06 17:31:18 +00001237
Guido van Rossum024da5c2007-05-17 23:59:11 +00001238 def __next__(self):
Guido van Rossumb9c4c3e2007-04-11 16:07:50 +00001239 self._telling = False
1240 line = self.readline()
1241 if not line:
1242 self._snapshot = None
1243 self._telling = self._seekable
1244 raise StopIteration
1245 return line
1246
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001247 def readline(self, limit=None):
1248 if limit is not None:
Guido van Rossum9b76da62007-04-11 01:09:03 +00001249 # XXX Hack to support limit argument, for backwards compatibility
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001250 line = self.readline()
1251 if len(line) <= limit:
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001252 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001253 line, self._pending = line[:limit], line[limit:] + self._pending
Guido van Rossumfa0054a2007-05-24 04:05:35 +00001254 return line
Guido van Rossum4f0db6e2007-04-08 23:59:06 +00001255
Guido van Rossum78892e42007-04-06 17:31:18 +00001256 line = self._pending
1257 start = 0
Guido van Rossum8358db22007-08-18 21:39:55 +00001258 cr_eof = False
Guido van Rossum78892e42007-04-06 17:31:18 +00001259 decoder = self._decoder or self._get_decoder()
1260
Guido van Rossum8358db22007-08-18 21:39:55 +00001261 pos = endpos = None
1262 ending = None
Guido van Rossum78892e42007-04-06 17:31:18 +00001263 while True:
Guido van Rossum8358db22007-08-18 21:39:55 +00001264 if self._readuniversal:
1265 # Universal newline search. Find any of \r, \r\n, \n
Guido van Rossum78892e42007-04-06 17:31:18 +00001266
Guido van Rossum8358db22007-08-18 21:39:55 +00001267 # In C we'd look for these in parallel of course.
1268 nlpos = line.find("\n", start)
1269 crpos = line.find("\r", start)
1270 if crpos == -1:
1271 if nlpos == -1:
1272 start = len(line)
Guido van Rossum78892e42007-04-06 17:31:18 +00001273 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001274 # Found \n
1275 pos = nlpos
1276 endpos = pos + 1
1277 ending = self._LF
1278 break
1279 elif nlpos == -1:
1280 if crpos == len(line) - 1:
1281 # Found \r at end of buffer, must keep reading
1282 start = crpos
1283 cr_eof = True
1284 else:
1285 # Found lone \r
1286 ending = self._CR
1287 pos = crpos
1288 endpos = pos + 1
1289 break
1290 elif nlpos < crpos:
1291 # Found \n
1292 pos = nlpos
1293 endpos = pos + 1
1294 ending = self._LF
Guido van Rossum78892e42007-04-06 17:31:18 +00001295 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001296 elif nlpos == crpos + 1:
1297 # Found \r\n
1298 ending = self._CRLF
1299 pos = crpos
1300 endpos = pos + 2
1301 break
1302 else:
1303 # Found \r
1304 pos = crpos
1305 endpos = pos + 1
1306 ending = self._CR
1307 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001308 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001309 # non-universal
1310 pos = line.find(self._readnl)
1311 if pos >= 0:
1312 endpos = pos+len(self._readnl)
1313 ending = self._nlflag(self._readnl)
1314 break
Guido van Rossum78892e42007-04-06 17:31:18 +00001315
1316 # No line ending seen yet - get more data
Guido van Rossum8358db22007-08-18 21:39:55 +00001317 more_line = ''
Guido van Rossum78892e42007-04-06 17:31:18 +00001318 while True:
Guido van Rossumcba608c2007-04-11 14:19:59 +00001319 readahead, pending = self._read_chunk()
1320 more_line = pending
1321 if more_line or not readahead:
Guido van Rossum78892e42007-04-06 17:31:18 +00001322 break
Guido van Rossum8358db22007-08-18 21:39:55 +00001323 if more_line:
1324 line += more_line
1325 else:
1326 # end of file
1327 self._pending = ''
1328 self._snapshot = None
1329 if cr_eof:
1330 self._seennl |= self._CR
1331 return line[:-1] + '\n'
1332 else:
1333 return line
Guido van Rossum78892e42007-04-06 17:31:18 +00001334
Guido van Rossum8358db22007-08-18 21:39:55 +00001335 self._pending = line[endpos:]
1336 if self._readtranslate:
1337 self._seennl |= ending
1338 if ending != self._LF:
1339 return line[:pos] + '\n'
1340 else:
1341 return line[:endpos]
Guido van Rossum78892e42007-04-06 17:31:18 +00001342 else:
Guido van Rossum8358db22007-08-18 21:39:55 +00001343 return line[:endpos]
Guido van Rossum024da5c2007-05-17 23:59:11 +00001344
Guido van Rossum8358db22007-08-18 21:39:55 +00001345 def _replacenl(self, data):
1346 # Replace newlines in data as needed and record that they have
1347 # been seen.
1348 if not self._readtranslate:
1349 return data
1350 if self._readuniversal:
1351 crlf = data.count('\r\n')
1352 cr = data.count('\r') - crlf
1353 lf = data.count('\n') - crlf
1354 self._seennl |= (lf and self._LF) | (cr and self._CR) \
1355 | (crlf and self._CRLF)
1356 if crlf:
1357 data = data.replace("\r\n", "\n")
1358 if cr:
1359 data = data.replace("\r", "\n")
1360 elif self._readnl == '\n':
1361 # Only need to detect if \n was seen.
1362 if data.count('\n'):
1363 self._seennl |= self._LF
1364 else:
1365 newdata = data.replace(self._readnl, '\n')
1366 if newdata is not data:
1367 self._seennl |= self._nlflag(self._readnl)
1368 data = newdata
1369 return data
1370
1371 _LF = 1
1372 _CR = 2
1373 _CRLF = 4
1374 @property
1375 def newlines(self):
1376 return (None,
1377 "\n",
1378 "\r",
1379 ("\r", "\n"),
1380 "\r\n",
1381 ("\n", "\r\n"),
1382 ("\r", "\r\n"),
1383 ("\r", "\n", "\r\n")
1384 )[self._seennl]
1385
1386 def _nlflag(self, nlstr):
1387 return [None, "\n", "\r", None, "\r\n"].index(nlstr)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001388
1389class StringIO(TextIOWrapper):
1390
1391 # XXX This is really slow, but fully functional
1392
Guido van Rossume86254e2007-08-29 18:31:16 +00001393 def __init__(self, initial_value="", encoding="utf-8", newline="\n"):
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001394 super(StringIO, self).__init__(BytesIO(),
1395 encoding=encoding,
1396 newline=newline)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001397 if initial_value:
Guido van Rossum34d19282007-08-09 01:03:29 +00001398 if not isinstance(initial_value, basestring):
1399 initial_value = str(initial_value)
Guido van Rossum024da5c2007-05-17 23:59:11 +00001400 self.write(initial_value)
1401 self.seek(0)
1402
1403 def getvalue(self):
Guido van Rossum34d19282007-08-09 01:03:29 +00001404 self.flush()
Guido van Rossum3e1f85e2007-07-27 18:03:11 +00001405 return self.buffer.getvalue().decode(self._encoding)