14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""" 24adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPython implementation of the io module. 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""" 44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom __future__ import (print_function, unicode_literals) 64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport abc 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport codecs 104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport warnings 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport errno 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Import thread instead of threading to reduce startup cost 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry: 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao from thread import allocate_lock as Lock 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError: 164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao from dummy_thread import allocate_lock as Lock 174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport io 194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END) 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom errno import EINTR 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__metaclass__ = type 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# open() uses st_blksize whenever we can 254adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDEFAULT_BUFFER_SIZE = 8 * 1024 # bytes 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# NOTE: Base classes defined here are registered with the "official" ABCs 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# defined in io.py. We don't use real inheritance though, because we don't 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# want to inherit the C implementations. 304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BlockingIOError(IOError): 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Exception raised when I/O would block on a non-blocking I/O stream.""" 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, errno, strerror, characters_written=0): 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao super(IOError, self).__init__(errno, strerror) 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(characters_written, (int, long)): 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("characters_written must be a integer") 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.characters_written = characters_written 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef open(file, mode="r", buffering=-1, 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoding=None, errors=None, 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao newline=None, closefd=True): 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao r"""Open file and return a stream. Raise IOError upon failure. 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao file is either a text or byte string giving the name (and the path 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if the file isn't in the current working directory) of the file to 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao be opened or an integer file descriptor of the file to be 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao wrapped. (If a file descriptor is given, it is closed when the 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao returned I/O object is closed, unless closefd is set to False.) 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao mode is an optional string that specifies the mode in which the file 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao is opened. It defaults to 'r' which means open for reading in text 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao mode. Other common values are 'w' for writing (truncating the file if 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao it already exists), and 'a' for appending (which on some Unix systems, 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao means that all writes append to the end of the file regardless of the 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao current seek position). In text mode, if encoding is not specified the 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoding used is platform dependent. (For reading and writing raw 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bytes use binary mode and leave encoding unspecified.) The available 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao modes are: 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ========= =============================================================== 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Character Meaning 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao --------- --------------------------------------------------------------- 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'r' open for reading (default) 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'w' open for writing, truncating the file first 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'a' open for writing, appending to the end of the file if it exists 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'b' binary mode 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 't' text mode (default) 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao '+' open a disk file for updating (reading and writing) 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'U' universal newline mode (for backwards compatibility; unneeded 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for new code) 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ========= =============================================================== 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The default mode is 'rt' (open for reading text). For binary random 794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao access, the mode 'w+b' opens and truncates the file to 0 bytes, while 804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'r+b' opens the file without truncation. 814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Python distinguishes between files opened in binary and text modes, 834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao even when the underlying operating system doesn't. Files opened in 844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao binary mode (appending 'b' to the mode argument) return contents as 854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bytes objects without any decoding. In text mode (the default, or when 864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 't' is appended to the mode argument), the contents of the file are 874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao returned as strings, the bytes having been first decoded using a 884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao platform-dependent encoding or using the specified encoding if given. 894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffering is an optional integer used to set the buffering policy. 914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Pass 0 to switch buffering off (only allowed in binary mode), 1 to select 924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line buffering (only usable in text mode), and an integer > 1 to indicate 934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao the size of a fixed-size chunk buffer. When no buffering argument is 944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao given, the default buffering policy works as follows: 954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao * Binary files are buffered in fixed-size chunks; the size of the buffer 974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao is chosen using a heuristic trying to determine the underlying device's 984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "block size" and falling back on `io.DEFAULT_BUFFER_SIZE`. 994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao On many systems, the buffer will typically be 4096 or 8192 bytes long. 1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao * "Interactive" text files (files for which isatty() returns True) 1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao use line buffering. Other text files use the policy described above 1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for binary files. 1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoding is the name of the encoding used to decode or encode the 1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao file. This should only be used in text mode. The default encoding is 1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao platform dependent, but any encoding supported by Python can be 1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao passed. See the codecs module for the list of supported encodings. 1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errors is an optional string that specifies how encoding errors are to 1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao be handled---this argument should not be used in binary mode. Pass 1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'strict' to raise a ValueError exception if there is an encoding error 1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (the default of None has the same effect), or pass 'ignore' to ignore 1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errors. (Note that ignoring encoding errors can lead to data loss.) 1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao See the documentation for codecs.register for a list of the permitted 1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoding error strings. 1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao newline controls how universal newlines works (it only applies to text 1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao mode). It can be None, '', '\n', '\r', and '\r\n'. It works as 1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao follows: 1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao * On input, if newline is None, universal newlines mode is 1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao enabled. Lines in the input can end in '\n', '\r', or '\r\n', and 1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao these are translated into '\n' before being returned to the 1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao caller. If it is '', universal newline mode is enabled, but line 1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endings are returned to the caller untranslated. If it has any of 1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao the other legal values, input lines are only terminated by the given 1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao string, and the line ending is returned to the caller untranslated. 1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao * On output, if newline is None, any '\n' characters written are 1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao translated to the system default line separator, os.linesep. If 1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao newline is '', no translation takes place. If newline is any of the 1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao other legal values, any '\n' characters written are translated to 1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao the given string. 1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If closefd is False, the underlying file descriptor will be kept open 1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao when the file is closed. This does not work when a file name is given 1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao and must be True in that case. 1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao open() returns a file object whose type depends on the mode, and 1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao through which the standard file operations such as reading and writing 1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao are performed. When open() is used to open a file in a text mode ('w', 1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open 1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a file in a binary mode, the returned class varies: in read binary 1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao mode, it returns a BufferedReader; in write binary and append binary 1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao modes, it returns a BufferedWriter, and in read/write mode, it returns 1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao a BufferedRandom. 1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao It is also possible to use a string or bytearray as a file for both 1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao reading and writing. For strings StringIO can be used like a file 1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao opened in a text mode, and for bytes a BytesIO can be used like a file 1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao opened in a binary mode. 1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(file, (basestring, int, long)): 1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("invalid file: %r" % file) 1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(mode, basestring): 1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("invalid mode: %r" % mode) 1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(buffering, (int, long)): 1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("invalid buffering: %r" % buffering) 1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if encoding is not None and not isinstance(encoding, basestring): 1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("invalid encoding: %r" % encoding) 1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if errors is not None and not isinstance(errors, basestring): 1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("invalid errors: %r" % errors) 1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao modes = set(mode) 1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if modes - set("arwb+tU") or len(mode) > len(modes): 1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid mode: %r" % mode) 1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao reading = "r" in modes 1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao writing = "w" in modes 1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao appending = "a" in modes 1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao updating = "+" in modes 1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao text = "t" in modes 1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao binary = "b" in modes 1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if "U" in modes: 1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if writing or appending: 1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("can't use U and writing mode at once") 1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao reading = True 1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if text and binary: 1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("can't have text and binary mode at once") 1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if reading + writing + appending > 1: 1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("can't have read/write/append mode at once") 1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not (reading or writing or appending): 1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("must have exactly one of read/write/append mode") 1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if binary and encoding is not None: 1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("binary mode doesn't take an encoding argument") 1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if binary and errors is not None: 1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("binary mode doesn't take an errors argument") 1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if binary and newline is not None: 1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("binary mode doesn't take a newline argument") 1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raw = FileIO(file, 1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (reading and "r" or "") + 1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (writing and "w" or "") + 1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (appending and "a" or "") + 1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (updating and "+" or ""), 1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao closefd) 1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line_buffering = False 1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if buffering == 1 or buffering < 0 and raw.isatty(): 1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffering = -1 1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line_buffering = True 1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if buffering < 0: 2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffering = DEFAULT_BUFFER_SIZE 2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bs = os.fstat(raw.fileno()).st_blksize 2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except (os.error, AttributeError): 2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if bs > 1: 2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffering = bs 2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if buffering < 0: 2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid buffering size") 2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if buffering == 0: 2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if binary: 2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return raw 2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("can't have unbuffered text I/O") 2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if updating: 2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffer = BufferedRandom(raw, buffering) 2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif writing or appending: 2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffer = BufferedWriter(raw, buffering) 2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif reading: 2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffer = BufferedReader(raw, buffering) 2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("unknown mode: %r" % mode) 2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if binary: 2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return buffer 2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering) 2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao text.mode = mode 2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return text 2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass DocDescriptor: 2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Helper for builtins.open.__doc__ 2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __get__(self, obj, typ): 2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return ( 2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "open(file, mode='r', buffering=-1, encoding=None, " 2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "errors=None, newline=None, closefd=True)\n\n" + 2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao open.__doc__) 2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass OpenWrapper: 2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Wrapper for builtins.open 2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Trick so that open won't become a bound method when stored 2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao as a class variable (as dbm.dumb does). 2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao See initstdio() in Python/pythonrun.c. 2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao __doc__ = DocDescriptor() 2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __new__(cls, *args, **kwargs): 2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return open(*args, **kwargs) 2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass UnsupportedOperation(ValueError, IOError): 2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass IOBase: 2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao __metaclass__ = abc.ABCMeta 2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """The abstract base class for all I/O classes, acting on streams of 2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bytes. There is no public constructor. 2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This class provides dummy implementations for many methods that 2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao derived classes can override selectively; the default implementations 2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao represent a file that cannot be read, written or seeked. 2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Even though IOBase does not declare read, readinto, or write because 2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao their signatures will vary, implementations and clients should 2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao consider those methods part of the interface. Also, implementations 2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao may raise a IOError when operations they do not support are called. 2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The basic type used for binary data read from or written to a file is 2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bytes. bytearrays are accepted too, and in some cases (such as 2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao readinto) needed. Text I/O classes work with str data. 2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Note that calling any method (even inquiries) on a closed stream is 2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao undefined. Implementations may raise IOError in this case. 2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao IOBase (and its subclasses) support the iterator protocol, meaning 2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao that an IOBase object can be iterated over yielding the lines in a 2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao stream. 2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao IOBase also supports the :keyword:`with` statement. In this example, 2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp is closed after the suite of the with statement is complete: 2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with open('spam.txt', 'r') as fp: 2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao fp.write('Spam and eggs!') 2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Internal ### 2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _unsupported(self, name): 2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Internal: raise an exception for unsupported operations.""" 2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise UnsupportedOperation("%s.%s() not supported" % 2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (self.__class__.__name__, name)) 2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Positioning ### 2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seek(self, pos, whence=0): 2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Change stream position. 3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Change the stream position to byte offset pos. Argument pos is 3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao interpreted relative to the position indicated by whence. Values 3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for whence are: 3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao * 0 -- start of stream (the default); offset should be zero or positive 3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao * 1 -- current stream position; offset may be negative 3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao * 2 -- end of stream; offset is usually negative 3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Return the new absolute position. 3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("seek") 3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tell(self): 3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Return current stream position.""" 3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.seek(0, 1) 3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def truncate(self, pos=None): 3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Truncate file to size bytes. 3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Size defaults to the current IO position as reported by tell(). Return 3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao the new size. 3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("truncate") 3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Flush and close ### 3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def flush(self): 3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Flush write buffers, if applicable. 3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This is not implemented for read-only and non-blocking streams. 3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._checkClosed() 3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX Should this return the number of bytes written??? 3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao __closed = False 3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def close(self): 3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Flush and close the IO object. 3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This method has no effect if the file is already closed. 3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self.__closed: 3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.__closed = True 3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __del__(self): 3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Destructor. Calls close().""" 3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The try/except block is in case this is called at program 3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # exit time, when it's possible that globals have already been 3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # deleted, and then the close() call might fail. Since 3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # there's nothing we can do about such failures and they annoy 3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # the end users, we suppress the traceback. 3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.close() 3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except: 3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Inquiries ### 3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seekable(self): 3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Return whether object supports random access. 3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If False, seek(), tell() and truncate() will raise IOError. 3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This method may need to do a test seek(). 3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return False 3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _checkSeekable(self, msg=None): 3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Internal: raise an IOError if file is not seekable 3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self.seekable(): 3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("File or stream is not seekable." 3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if msg is None else msg) 3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readable(self): 3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Return whether object was opened for reading. 3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If False, read() will raise IOError. 3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return False 3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _checkReadable(self, msg=None): 3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Internal: raise an IOError if file is not readable 3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self.readable(): 3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("File or stream is not readable." 3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if msg is None else msg) 3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def writable(self): 3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Return whether object was opened for writing. 3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If False, write() and truncate() will raise IOError. 3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return False 3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _checkWritable(self, msg=None): 4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Internal: raise an IOError if file is not writable 4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self.writable(): 4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("File or stream is not writable." 4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if msg is None else msg) 4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def closed(self): 4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """closed: bool. True iff the file has been closed. 4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao For backwards compatibility, this is a property, not a predicate. 4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__closed 4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _checkClosed(self, msg=None): 4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Internal: raise an ValueError if file is closed 4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("I/O operation on closed file." 4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if msg is None else msg) 4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Context manager ### 4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __enter__(self): 4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Context management protocol. Returns self.""" 4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._checkClosed() 4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self 4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __exit__(self, *args): 4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Context management protocol. Calls close()""" 4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.close() 4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Lower-level APIs ### 4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX Should these be present even if unimplemented? 4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def fileno(self): 4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Returns underlying file descriptor if one exists. 4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao An IOError is raised if the IO object does not use a file descriptor. 4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("fileno") 4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isatty(self): 4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Return whether this is an 'interactive' stream. 4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Return False if it can't be determined. 4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._checkClosed() 4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return False 4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Readline[s] and writelines ### 4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readline(self, limit=-1): 4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao r"""Read and return a line from the stream. 4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If limit is specified, at most limit bytes will be read. 4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The line terminator is always b'\n' for binary files; for text 4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao files, the newlines argument to open can be used to select the line 4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao terminator(s) recognized. 4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # For backwards compatibility, a (slowish) readline(). 4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if hasattr(self, "peek"): 4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def nreadahead(): 4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao readahead = self.peek(1) 4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not readahead: 4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 1 4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = (readahead.find(b"\n") + 1) or len(readahead) 4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if limit >= 0: 4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = min(n, limit) 4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return n 4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def nreadahead(): 4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 1 4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if limit is None: 4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao limit = -1 4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif not isinstance(limit, (int, long)): 4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("limit must be an integer") 4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res = bytearray() 4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while limit < 0 or len(res) < limit: 4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b = self.read(nreadahead()) 4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not b: 4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res += b 4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if res.endswith(b"\n"): 4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return bytes(res) 4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __iter__(self): 4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._checkClosed() 4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self 4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def next(self): 4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line = self.readline() 4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not line: 4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise StopIteration 4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return line 4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readlines(self, hint=None): 5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Return a list of lines from the stream. 5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao hint can be specified to control the number of lines read: no more 5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao lines will be read if the total size (in bytes/characters) of all 5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao lines so far exceeds hint. 5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if hint is not None and not isinstance(hint, (int, long)): 5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("integer or None expected") 5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if hint is None or hint <= 0: 5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return list(self) 5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = 0 5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao lines = [] 5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line in self: 5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao lines.append(line) 5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n += len(line) 5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n >= hint: 5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return lines 5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def writelines(self, lines): 5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._checkClosed() 5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for line in lines: 5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.write(line) 5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoio.IOBase.register(IOBase) 5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass RawIOBase(IOBase): 5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Base class for raw binary I/O.""" 5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The read() method is implemented by calling readinto(); derived 5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # classes that want to support read() only need to implement 5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # readinto() as a primitive operation. In general, readinto() can be 5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # more efficient than read(). 5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # (It would be tempting to also provide an implementation of 5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # readinto() in terms of read(), in case the latter is a more suitable 5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # primitive operation, but that would lead to nasty recursion in case 5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # a subclass doesn't implement either.) 5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read(self, n=-1): 5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read and return up to n bytes. 5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Returns an empty bytes object on EOF, or None if the object is 5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao set not to block and has no data to read. 5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None: 5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = -1 5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n < 0: 5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.readall() 5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b = bytearray(n.__index__()) 5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = self.readinto(b) 5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None: 5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return None 5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del b[n:] 5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return bytes(b) 5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readall(self): 5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read until EOF, using multiple read() call.""" 5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res = bytearray() 5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = self.read(DEFAULT_BUFFER_SIZE) 5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not data: 5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao res += data 5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if res: 5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return bytes(res) 5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # b'' or None 5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return data 5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readinto(self, b): 5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read up to len(b) bytes into b. 5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Returns number of bytes read (0 for EOF), or None if the object 5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao is set not to block and has no data to read. 5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("readinto") 5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def write(self, b): 5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Write the given buffer to the IO stream. 5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Returns the number of bytes written, which may be less than len(b). 5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("write") 5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoio.RawIOBase.register(RawIOBase) 5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom _io import FileIO 5894adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoRawIOBase.register(FileIO) 5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedIOBase(IOBase): 5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Base class for buffered IO objects. 5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The main difference with RawIOBase is that the read() method 5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao supports omitting the size argument, and does not have a default 5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao implementation that defers to readinto(). 5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao In addition, read(), readinto() and write() may raise 6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao BlockingIOError if the underlying raw stream is in non-blocking 6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao mode and not ready; unlike their raw counterparts, they will never 6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return None. 6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao A typical implementation should not inherit from a RawIOBase 6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao implementation, but wrap one. 6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read(self, n=None): 6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read and return up to n bytes. 6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If the argument is omitted, None, or negative, reads and 6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao returns all data until EOF. 6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If the argument is positive, and the underlying raw stream is 6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao not 'interactive', multiple raw reads may be issued to satisfy 6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao the byte count (unless EOF is reached first). But for 6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao interactive raw streams (XXX and for pipes?), at most one raw 6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao read will be issued, and a short result does not imply that 6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao EOF is imminent. 6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Returns an empty bytes array on EOF. 6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Raises BlockingIOError if the underlying raw stream has no 6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data at the moment. 6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("read") 6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read1(self, n=None): 6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read up to n bytes with at most one read() system call.""" 6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("read1") 6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readinto(self, b): 6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read up to len(b) bytes into b. 6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Like read(), this may issue multiple reads to the underlying raw 6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao stream, unless the latter is 'interactive'. 6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Returns the number of bytes read (0 for EOF). 6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Raises BlockingIOError if the underlying raw stream has no 6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data at the moment. 6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX This ought to work with anything that supports the buffer API 6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao data = self.read(len(b)) 6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = len(data) 6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b[:n] = data 6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except TypeError as err: 6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import array 6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(b, array.array): 6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise err 6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b[:n] = array.array(b'b', data) 6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return n 6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def write(self, b): 6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Write the given buffer to the IO stream. 6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Return the number of bytes written, which is never less than 6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao len(b). 6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Raises BlockingIOError if the buffer is full and the 6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao underlying raw stream cannot accept more data at the moment. 6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("write") 6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def detach(self): 6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Separate the underlying raw stream from the buffer and return it. 6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao After the raw stream has been detached, the buffer is in an unusable 6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao state. 6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("detach") 6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoio.BufferedIOBase.register(BufferedIOBase) 6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _BufferedIOMixin(BufferedIOBase): 6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """A mixin implementation of BufferedIOBase with an underlying raw stream. 6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This passes most requests on to the underlying raw stream. It 6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao does *not* provide implementations of read(), readinto() or 6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao write(). 6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, raw): 6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._raw = raw 6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Positioning ### 6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seek(self, pos, whence=0): 6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao new_position = self.raw.seek(pos, whence) 6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if new_position < 0: 6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("seek() returned an invalid position") 6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return new_position 6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tell(self): 7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self.raw.tell() 7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos < 0: 7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("tell() returned an invalid position") 7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return pos 7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def truncate(self, pos=None): 7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Flush the stream. We're mixing buffered I/O with lower-level I/O, 7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # and a flush may be necessary to synch both views of the current 7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # file state. 7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos is None: 7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self.tell() 7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX: Should seek() be used, instead of passing the position 7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX directly to truncate? 7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.truncate(pos) 7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Flush and close ### 7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def flush(self): 7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("flush of closed file") 7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.raw.flush() 7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def close(self): 7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.raw is not None and not self.closed: 7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # may raise BlockingIOError or BrokenPipeError etc 7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.raw.close() 7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def detach(self): 7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.raw is None: 7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("raw stream already detached") 7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raw = self._raw 7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._raw = None 7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return raw 7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Inquiries ### 7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seekable(self): 7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.seekable() 7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readable(self): 7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.readable() 7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def writable(self): 7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.writable() 7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def raw(self): 7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._raw 7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def closed(self): 7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.closed 7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def name(self): 7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.name 7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def mode(self): 7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.mode 7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __repr__(self): 7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao clsname = self.__class__.__name__ 7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao name = self.name 7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except AttributeError: 7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return "<_pyio.{0}>".format(clsname) 7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return "<_pyio.{0} name={1!r}>".format(clsname, name) 7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ### Lower-level APIs ### 7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def fileno(self): 7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.fileno() 7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isatty(self): 7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.isatty() 7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BytesIO(BufferedIOBase): 7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Buffered I/O implementation using an in-memory bytes buffer.""" 7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, initial_bytes=None): 7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buf = bytearray() 7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if initial_bytes is not None: 7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buf.extend(initial_bytes) 7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._buffer = buf 7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._pos = 0 7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __getstate__(self): 7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("__getstate__ on closed file") 7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__dict__.copy() 8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def getvalue(self): 8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Return the bytes value (contents) of the buffer 8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("getvalue on closed file") 8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return bytes(self._buffer) 8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read(self, n=None): 8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("read from closed file") 8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None: 8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = -1 8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(n, (int, long)): 8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("integer argument expected, got {0!r}".format( 8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao type(n))) 8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n < 0: 8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = len(self._buffer) 8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if len(self._buffer) <= self._pos: 8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return b"" 8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao newpos = min(len(self._buffer), self._pos + n) 8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b = self._buffer[self._pos : newpos] 8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._pos = newpos 8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return bytes(b) 8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read1(self, n): 8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """This is the same as read. 8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.read(n) 8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def write(self, b): 8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("write to closed file") 8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(b, unicode): 8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("can't write unicode to binary stream") 8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = len(b) 8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n == 0: 8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return 0 8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self._pos 8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos > len(self._buffer): 8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Inserts null bytes between the current end of the file 8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # and the new write position. 8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao padding = b'\x00' * (pos - len(self._buffer)) 8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._buffer += padding 8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._buffer[pos:pos + n] = b 8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._pos += n 8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return n 8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seek(self, pos, whence=0): 8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("seek on closed file") 8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos.__index__ 8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except AttributeError: 8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("an integer is required") 8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if whence == 0: 8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos < 0: 8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("negative seek position %r" % (pos,)) 8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._pos = pos 8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif whence == 1: 8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._pos = max(0, self._pos + pos) 8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif whence == 2: 8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._pos = max(0, len(self._buffer) + pos) 8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid whence value") 8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._pos 8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tell(self): 8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("tell on closed file") 8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._pos 8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def truncate(self, pos=None): 8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("truncate on closed file") 8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos is None: 8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self._pos 8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos.__index__ 8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except AttributeError: 8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("an integer is required") 8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos < 0: 8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("negative truncate position %r" % (pos,)) 8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del self._buffer[pos:] 8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return pos 8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readable(self): 8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("I/O operation on closed file.") 8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return True 8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def writable(self): 8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("I/O operation on closed file.") 8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return True 8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seekable(self): 8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("I/O operation on closed file.") 9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return True 9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedReader(_BufferedIOMixin): 9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """BufferedReader(raw[, buffer_size]) 9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao A buffer for a readable, sequential BaseRawIO object. 9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The constructor creates a BufferedReader for the given readable raw 9104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE 9114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao is used. 9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE): 9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Create a new buffered reader using the given readable raw IO object. 9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not raw.readable(): 9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError('"raw" argument must be readable.') 9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _BufferedIOMixin.__init__(self, raw) 9214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if buffer_size <= 0: 9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid buffer size") 9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.buffer_size = buffer_size 9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._reset_read_buf() 9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._read_lock = Lock() 9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _reset_read_buf(self): 9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._read_buf = b"" 9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._read_pos = 0 9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read(self, n=None): 9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read n bytes. 9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Returns exactly n bytes of data unless the underlying raw IO 9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao stream reaches EOF or if the call would block in non-blocking 9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao mode. If n is negative, read until EOF or until read() would 9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao block. 9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 9394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is not None and n < -1: 9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid number of bytes to read") 9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._read_lock: 9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._read_unlocked(n) 9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _read_unlocked(self, n=None): 9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao nodata_val = b"" 9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao empty_values = (b"", None) 9474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buf = self._read_buf 9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self._read_pos 9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Special case for when the number of bytes to read is unspecified. 9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None or n == -1: 9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._reset_read_buf() 9534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chunks = [buf[pos:]] # Strip the consumed bytes. 9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao current_size = 0 9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read until EOF or until read() would block. 9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chunk = self.raw.read() 9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except IOError as e: 9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if e.errno != EINTR: 9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise 9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao continue 9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if chunk in empty_values: 9644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao nodata_val = chunk 9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao current_size += len(chunk) 9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chunks.append(chunk) 9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return b"".join(chunks) or nodata_val 9694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The number of bytes to read is specified, return at most n bytes. 9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao avail = len(buf) - pos # Length of the available buffered data. 9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n <= avail: 9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Fast path: the data to read is fully buffered. 9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._read_pos += n 9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return buf[pos:pos+n] 9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Slow path: read from the stream until enough bytes are read, 9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # or until an EOF occurs or until read() would block. 9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chunks = [buf[pos:]] 9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao wanted = max(self.buffer_size, n) 9804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while avail < n: 9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chunk = self.raw.read(wanted) 9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except IOError as e: 9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if e.errno != EINTR: 9854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise 9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao continue 9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if chunk in empty_values: 9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao nodata_val = chunk 9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 9904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao avail += len(chunk) 9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chunks.append(chunk) 9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # n is more then avail only when an EOF occurred or when 9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # read() would have blocked. 9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = min(n, avail) 9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao out = b"".join(chunks) 9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._read_buf = out[n:] # Save the extra data in the buffer. 9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._read_pos = 0 9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return out[:n] if out else nodata_val 9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def peek(self, n=0): 10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Returns buffered bytes without advancing the position. 10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The argument indicates a desired minimal number of bytes; we 10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao do at most one raw read to satisfy it. We never return more 10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao than self.buffer_size. 10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._read_lock: 10084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._peek_unlocked(n) 10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _peek_unlocked(self, n=0): 10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao want = min(n, self.buffer_size) 10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao have = len(self._read_buf) - self._read_pos 10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if have < want or have <= 0: 10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao to_read = self.buffer_size - have 10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 10164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao current = self.raw.read(to_read) 10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except IOError as e: 10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if e.errno != EINTR: 10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise 10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao continue 10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if current: 10244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._read_buf = self._read_buf[self._read_pos:] + current 10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._read_pos = 0 10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._read_buf[self._read_pos:] 10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read1(self, n): 10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Reads up to n bytes, with at most one read() system call.""" 10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Returns up to n bytes. If at least one byte is buffered, we 10314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # only return buffered bytes. Otherwise, we do one raw read. 10324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n < 0: 10334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("number of bytes to read must be positive") 10344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n == 0: 10354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return b"" 10364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._read_lock: 10374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._peek_unlocked(1) 10384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._read_unlocked( 10394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao min(n, len(self._read_buf) - self._read_pos)) 10404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tell(self): 10424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return _BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos 10434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seek(self, pos, whence=0): 10454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not (0 <= whence <= 2): 10464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid whence value") 10474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._read_lock: 10484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if whence == 1: 10494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos -= len(self._read_buf) - self._read_pos 10504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = _BufferedIOMixin.seek(self, pos, whence) 10514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._reset_read_buf() 10524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return pos 10534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedWriter(_BufferedIOMixin): 10554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """A buffer for a writeable sequential RawIO object. 10574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The constructor creates a BufferedWriter for the given writeable raw 10594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao stream. If the buffer_size is not given, it defaults to 10604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao DEFAULT_BUFFER_SIZE. 10614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 10624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _warning_stack_offset = 2 10644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, raw, 10664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): 10674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not raw.writable(): 10684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError('"raw" argument must be writable.') 10694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _BufferedIOMixin.__init__(self, raw) 10714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if buffer_size <= 0: 10724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid buffer size") 10734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if max_buffer_size is not None: 10744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 10754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._warning_stack_offset) 10764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.buffer_size = buffer_size 10774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._write_buf = bytearray() 10784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._write_lock = Lock() 10794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 10804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def write(self, b): 10814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 10824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("write to closed file") 10834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(b, unicode): 10844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("can't write unicode to binary stream") 10854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._write_lock: 10864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX we can implement some more tricks to try and avoid 10874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # partial writes 10884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if len(self._write_buf) > self.buffer_size: 10894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # We're full, so let's pre-flush the buffer. (This may 10904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # raise BlockingIOError with characters_written == 0.) 10914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._flush_unlocked() 10924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao before = len(self._write_buf) 10934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._write_buf.extend(b) 10944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao written = len(self._write_buf) - before 10954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if len(self._write_buf) > self.buffer_size: 10964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 10974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._flush_unlocked() 10984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except BlockingIOError as e: 10994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if len(self._write_buf) > self.buffer_size: 11004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # We've hit the buffer_size. We have to accept a partial 11014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # write and cut back our buffer. 11024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao overage = len(self._write_buf) - self.buffer_size 11034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao written -= overage 11044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._write_buf = self._write_buf[:self.buffer_size] 11054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise BlockingIOError(e.errno, e.strerror, written) 11064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return written 11074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def truncate(self, pos=None): 11094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._write_lock: 11104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._flush_unlocked() 11114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos is None: 11124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self.raw.tell() 11134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.raw.truncate(pos) 11144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def flush(self): 11164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._write_lock: 11174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._flush_unlocked() 11184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _flush_unlocked(self): 11204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 11214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("flush of closed file") 11224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while self._write_buf: 11234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 11244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = self.raw.write(self._write_buf) 11254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except BlockingIOError: 11264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise RuntimeError("self.raw should implement RawIOBase: it " 11274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "should not raise BlockingIOError") 11284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except IOError as e: 11294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if e.errno != EINTR: 11304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise 11314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao continue 11324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None: 11334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise BlockingIOError( 11344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errno.EAGAIN, 11354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "write could not complete without blocking", 0) 11364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n > len(self._write_buf) or n < 0: 11374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("write() returned incorrect number of bytes") 11384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del self._write_buf[:n] 11394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tell(self): 11414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return _BufferedIOMixin.tell(self) + len(self._write_buf) 11424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seek(self, pos, whence=0): 11444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not (0 <= whence <= 2): 11454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid whence") 11464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._write_lock: 11474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._flush_unlocked() 11484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return _BufferedIOMixin.seek(self, pos, whence) 11494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedRWPair(BufferedIOBase): 11524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """A buffered reader and writer object together. 11544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao A buffered reader object and buffered writer object put together to 11564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao form a sequential IO object that can read and write. This is typically 11574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao used with a socket or two-way pipe. 11584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao reader and writer are RawIOBase objects that are readable and 11604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao writeable respectively. If the buffer_size is omitted it defaults to 11614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao DEFAULT_BUFFER_SIZE. 11624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 11634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX The usefulness of this (compared to having two separate IO 11654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # objects) is questionable. 11664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, reader, writer, 11684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): 11694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Constructor. 11704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The arguments are two RawIO instances. 11724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 11734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if max_buffer_size is not None: 11744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2) 11754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not reader.readable(): 11774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError('"reader" argument must be readable.') 11784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not writer.writable(): 11804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError('"writer" argument must be writable.') 11814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.reader = BufferedReader(reader, buffer_size) 11834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.writer = BufferedWriter(writer, buffer_size) 11844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read(self, n=None): 11864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None: 11874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = -1 11884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.reader.read(n) 11894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readinto(self, b): 11914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.reader.readinto(b) 11924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def write(self, b): 11944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.writer.write(b) 11954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def peek(self, n=0): 11974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.reader.peek(n) 11984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 11994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read1(self, n): 12004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.reader.read1(n) 12014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readable(self): 12034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.reader.readable() 12044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def writable(self): 12064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.writer.writable() 12074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def flush(self): 12094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.writer.flush() 12104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def close(self): 12124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.writer.close() 12134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.reader.close() 12144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isatty(self): 12164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.reader.isatty() or self.writer.isatty() 12174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 12194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def closed(self): 12204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.writer.closed 12214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BufferedRandom(BufferedWriter, BufferedReader): 12244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """A buffered interface to random access streams. 12264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The constructor creates a reader and writer for a seekable stream, 12284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raw, given in the first argument. If the buffer_size is omitted it 12294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao defaults to DEFAULT_BUFFER_SIZE. 12304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 12314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _warning_stack_offset = 3 12334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, raw, 12354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): 12364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raw._checkSeekable() 12374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao BufferedReader.__init__(self, raw, buffer_size) 12384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size) 12394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seek(self, pos, whence=0): 12414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not (0 <= whence <= 2): 12424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid whence") 12434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 12444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._read_buf: 12454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Undo read ahead. 12464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._read_lock: 12474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.raw.seek(self._read_pos - len(self._read_buf), 1) 12484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # First do the raw seek, then empty the read buffer, so that 12494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # if the raw seek fails, we don't lose buffered data forever. 12504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self.raw.seek(pos, whence) 12514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._read_lock: 12524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._reset_read_buf() 12534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos < 0: 12544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("seek() returned invalid position") 12554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return pos 12564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tell(self): 12584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._write_buf: 12594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return BufferedWriter.tell(self) 12604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 12614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return BufferedReader.tell(self) 12624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def truncate(self, pos=None): 12644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos is None: 12654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self.tell() 12664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Use seek to flush the read buffer. 12674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return BufferedWriter.truncate(self, pos) 12684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read(self, n=None): 12704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None: 12714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = -1 12724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 12734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return BufferedReader.read(self, n) 12744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readinto(self, b): 12764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 12774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return BufferedReader.readinto(self, b) 12784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def peek(self, n=0): 12804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 12814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return BufferedReader.peek(self, n) 12824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read1(self, n): 12844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 12854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return BufferedReader.read1(self, n) 12864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def write(self, b): 12884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._read_buf: 12894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Undo readahead 12904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao with self._read_lock: 12914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.raw.seek(self._read_pos - len(self._read_buf), 1) 12924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._reset_read_buf() 12934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return BufferedWriter.write(self, b) 12944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TextIOBase(IOBase): 12974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 12984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Base class for text I/O. 12994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao This class provides a character and line based interface to stream 13014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao I/O. There is no readinto method because Python's character strings 13024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao are immutable. There is no public constructor. 13034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 13044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read(self, n=-1): 13064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read at most n characters from stream. 13074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Read from underlying buffer until we have n characters or we hit EOF. 13094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If n is negative or omitted, read until EOF. 13104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 13114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("read") 13124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def write(self, s): 13144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Write string s to stream.""" 13154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("write") 13164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def truncate(self, pos=None): 13184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Truncate size to pos.""" 13194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("truncate") 13204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readline(self): 13224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Read until newline or EOF. 13234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Returns an empty string if EOF is hit immediately. 13254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 13264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("readline") 13274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def detach(self): 13294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 13304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Separate the underlying buffer from the TextIOBase and return it. 13314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao After the underlying buffer has been detached, the TextIO is in an 13334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unusable state. 13344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 13354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("detach") 13364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 13384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def encoding(self): 13394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Subclasses should override.""" 13404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return None 13414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 13434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def newlines(self): 13444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Line endings translated so far. 13454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Only line endings translated during reading are considered. 13474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Subclasses should override. 13494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 13504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return None 13514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 13534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def errors(self): 13544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Error setting of the decoder or encoder. 13554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Subclasses should override.""" 13574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return None 13584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoio.TextIOBase.register(TextIOBase) 13604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass IncrementalNewlineDecoder(codecs.IncrementalDecoder): 13634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao r"""Codec used when reading a file in universal newlines mode. It wraps 13644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao another incremental decoder, translating \r\n and \r into \n. It also 13654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao records the types of newlines encountered. When used with 13664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao translate=False, it ensures that the newline sequence is returned in 13674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao one piece. 13684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 13694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, decoder, translate, errors='strict'): 13704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao codecs.IncrementalDecoder.__init__(self, errors=errors) 13714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.translate = translate 13724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.decoder = decoder 13734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.seennl = 0 13744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.pendingcr = False 13754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def decode(self, input, final=False): 13774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # decode input (with the eventual \r from a previous pass) 13784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.decoder is None: 13794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao output = input 13804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 13814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao output = self.decoder.decode(input, final=final) 13824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.pendingcr and (output or final): 13834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao output = "\r" + output 13844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.pendingcr = False 13854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # retain last \r even when not translating data: 13874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # then readline() is sure to get \r\n in one pass 13884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if output.endswith("\r") and not final: 13894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao output = output[:-1] 13904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.pendingcr = True 13914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Record which newlines are read 13934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao crlf = output.count('\r\n') 13944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao cr = output.count('\r') - crlf 13954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao lf = output.count('\n') - crlf 13964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.seennl |= (lf and self._LF) | (cr and self._CR) \ 13974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao | (crlf and self._CRLF) 13984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 13994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.translate: 14004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if crlf: 14014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao output = output.replace("\r\n", "\n") 14024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if cr: 14034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao output = output.replace("\r", "\n") 14044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return output 14064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def getstate(self): 14084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.decoder is None: 14094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buf = b"" 14104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao flag = 0 14114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 14124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buf, flag = self.decoder.getstate() 14134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao flag <<= 1 14144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.pendingcr: 14154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao flag |= 1 14164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return buf, flag 14174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def setstate(self, state): 14194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buf, flag = state 14204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.pendingcr = bool(flag & 1) 14214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.decoder is not None: 14224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.decoder.setstate((buf, flag >> 1)) 14234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def reset(self): 14254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.seennl = 0 14264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.pendingcr = False 14274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.decoder is not None: 14284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.decoder.reset() 14294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _LF = 1 14314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _CR = 2 14324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _CRLF = 4 14334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 14354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def newlines(self): 14364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return (None, 14374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "\n", 14384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "\r", 14394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ("\r", "\n"), 14404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "\r\n", 14414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ("\n", "\r\n"), 14424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ("\r", "\r\n"), 14434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ("\r", "\n", "\r\n") 14444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao )[self.seennl] 14454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TextIOWrapper(TextIOBase): 14484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao r"""Character and line based layer over a BufferedIOBase object, buffer. 14504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoding gives the name of the encoding that the stream will be 14524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao decoded or encoded with. It defaults to locale.getpreferredencoding. 14534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errors determines the strictness of encoding and decoding (see the 14554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao codecs.register) and defaults to "strict". 14564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao newline can be None, '', '\n', '\r', or '\r\n'. It controls the 14584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao handling of line endings. If it is None, universal newlines is 14594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao enabled. With this enabled, on input, the lines endings '\n', '\r', 14604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao or '\r\n' are translated to '\n' before being returned to the 14614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao caller. Conversely, on output, '\n' is translated to the system 14624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao default line separator, os.linesep. If newline is any other of its 14634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao legal values, that newline becomes the newline when the file is read 14644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao and it is returned untranslated. On output, '\n' is converted to the 14654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao newline. 14664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If line_buffering is True, a call to flush is implied when a call to 14684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao write contains a newline character. 14694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 14704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao _CHUNK_SIZE = 2048 14724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, buffer, encoding=None, errors=None, newline=None, 14744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line_buffering=False): 14754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if newline is not None and not isinstance(newline, basestring): 14764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("illegal newline type: %r" % (type(newline),)) 14774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if newline not in (None, "", "\n", "\r", "\r\n"): 14784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("illegal newline value: %r" % (newline,)) 14794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if encoding is None: 14804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 14814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import locale 14824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except ImportError: 14834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Importing locale may fail if Python is being built 14844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoding = "ascii" 14854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 14864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoding = locale.getpreferredencoding() 14874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(encoding, basestring): 14894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid encoding: %r" % encoding) 14904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if errors is None: 14924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errors = "strict" 14934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 14944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(errors, basestring): 14954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid errors: %r" % errors) 14964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 14974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._buffer = buffer 14984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._line_buffering = line_buffering 14994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._encoding = encoding 15004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._errors = errors 15014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._readuniversal = not newline 15024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._readtranslate = newline is None 15034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._readnl = newline 15044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._writetranslate = newline != '' 15054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._writenl = newline or os.linesep 15064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._encoder = None 15074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoder = None 15084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoded_chars = '' # buffer for text returned from decoder 15094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoded_chars_used = 0 # offset into _decoded_chars for read() 15104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = None # info for reconstructing decoder state 15114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._seekable = self._telling = self.buffer.seekable() 15124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._seekable and self.writable(): 15144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao position = self.buffer.tell() 15154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if position != 0: 15164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 15174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._get_encoder().setstate(0) 15184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except LookupError: 15194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Sometimes the encoder doesn't exist 15204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 15214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # self._snapshot is either None, or a tuple (dec_flags, next_input) 15234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # where dec_flags is the second (integer) item of the decoder state 15244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # and next_input is the chunk of input bytes that comes next after the 15254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # snapshot point. We use this to reconstruct decoder states in tell(). 15264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Naming convention: 15284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - "bytes_..." for integer variables that count input bytes 15294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # - "chars_..." for integer variables that count decoded characters 15304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __repr__(self): 15324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 15334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao name = self.name 15344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except AttributeError: 15354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return "<_pyio.TextIOWrapper encoding='{0}'>".format(self.encoding) 15364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 15374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return "<_pyio.TextIOWrapper name={0!r} encoding='{1}'>".format( 15384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao name, self.encoding) 15394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 15414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def encoding(self): 15424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._encoding 15434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 15454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def errors(self): 15464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._errors 15474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 15494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def line_buffering(self): 15504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._line_buffering 15514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 15534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def buffer(self): 15544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._buffer 15554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seekable(self): 15574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 15584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("I/O operation on closed file.") 15594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._seekable 15604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readable(self): 15624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.buffer.readable() 15634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def writable(self): 15654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.buffer.writable() 15664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def flush(self): 15684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.buffer.flush() 15694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._telling = self._seekable 15704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def close(self): 15724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.buffer is not None and not self.closed: 15734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 15744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 15754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 15764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.buffer.close() 15774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 15794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def closed(self): 15804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.buffer.closed 15814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 15834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def name(self): 15844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.buffer.name 15854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def fileno(self): 15874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.buffer.fileno() 15884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isatty(self): 15904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.buffer.isatty() 15914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 15924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def write(self, s): 15934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 15944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("write to closed file") 15954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(s, unicode): 15964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("can't write %s to text stream" % 15974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao s.__class__.__name__) 15984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao length = len(s) 15994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao haslf = (self._writetranslate or self._line_buffering) and "\n" in s 16004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if haslf and self._writetranslate and self._writenl != "\n": 16014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao s = s.replace("\n", self._writenl) 16024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoder = self._encoder or self._get_encoder() 16034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX What if we were just reading? 16044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao b = encoder.encode(s) 16054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.buffer.write(b) 16064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._line_buffering and (haslf or "\r" in s): 16074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 16084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = None 16094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._decoder: 16104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoder.reset() 16114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return length 16124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _get_encoder(self): 16144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao make_encoder = codecs.getincrementalencoder(self._encoding) 16154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._encoder = make_encoder(self._errors) 16164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._encoder 16174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _get_decoder(self): 16194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao make_decoder = codecs.getincrementaldecoder(self._encoding) 16204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao decoder = make_decoder(self._errors) 16214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._readuniversal: 16224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao decoder = IncrementalNewlineDecoder(decoder, self._readtranslate) 16234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoder = decoder 16244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return decoder 16254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The following three methods implement an ADT for _decoded_chars. 16274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Text returned from the decoder is buffered here until the client 16284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # requests it by calling our read() or readline() method. 16294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _set_decoded_chars(self, chars): 16304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Set the _decoded_chars buffer.""" 16314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoded_chars = chars 16324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoded_chars_used = 0 16334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _get_decoded_chars(self, n=None): 16354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Advance into the _decoded_chars buffer.""" 16364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao offset = self._decoded_chars_used 16374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None: 16384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chars = self._decoded_chars[offset:] 16394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 16404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chars = self._decoded_chars[offset:offset + n] 16414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoded_chars_used += len(chars) 16424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return chars 16434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _rewind_decoded_chars(self, n): 16454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Rewind the _decoded_chars buffer.""" 16464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._decoded_chars_used < n: 16474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise AssertionError("rewind decoded_chars out of bounds") 16484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoded_chars_used -= n 16494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _read_chunk(self): 16514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 16524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Read and decode the next chunk of data from the BufferedReader. 16534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 16544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The return value is True unless EOF was reached. The decoded 16564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # string is placed in self._decoded_chars (replacing its previous 16574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # value). The entire input chunk is sent to the decoder, though 16584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # some of it may remain buffered in the decoder, yet to be 16594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # converted. 16604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._decoder is None: 16624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("no decoder") 16634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._telling: 16654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # To prepare for tell(), we need to snapshot a point in the 16664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # file where the decoder's input buffer is empty. 16674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dec_buffer, dec_flags = self._decoder.getstate() 16694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Given this, we know there was a valid snapshot point 16704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # len(dec_buffer) bytes ago with decoder state (b'', dec_flags). 16714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read a chunk, decode it, and put the result in self._decoded_chars. 16734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao input_chunk = self.buffer.read1(self._CHUNK_SIZE) 16744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao eof = not input_chunk 16754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._set_decoded_chars(self._decoder.decode(input_chunk, eof)) 16764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._telling: 16784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # At the snapshot point, len(dec_buffer) bytes before the read, 16794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # the next input to be decoded is dec_buffer + input_chunk. 16804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = (dec_flags, dec_buffer + input_chunk) 16814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return not eof 16834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _pack_cookie(self, position, dec_flags=0, 16854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bytes_to_feed=0, need_eof=0, chars_to_skip=0): 16864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The meaning of a tell() cookie is: seek to position, set the 16874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # decoder flags to dec_flags, read bytes_to_feed bytes, feed them 16884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # into the decoder with need_eof as the EOF flag, then skip 16894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # chars_to_skip characters of the decoded result. For most simple 16904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # decoders, tell() will often just give a byte offset in the file. 16914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return (position | (dec_flags<<64) | (bytes_to_feed<<128) | 16924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (chars_to_skip<<192) | bool(need_eof)<<256) 16934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 16944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def _unpack_cookie(self, bigint): 16954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao rest, position = divmod(bigint, 1<<64) 16964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao rest, dec_flags = divmod(rest, 1<<64) 16974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao rest, bytes_to_feed = divmod(rest, 1<<64) 16984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao need_eof, chars_to_skip = divmod(rest, 1<<64) 16994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return position, dec_flags, bytes_to_feed, need_eof, chars_to_skip 17004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def tell(self): 17024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self._seekable: 17034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("underlying stream is not seekable") 17044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self._telling: 17054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("telling position disabled by next() call") 17064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 17074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao position = self.buffer.tell() 17084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao decoder = self._decoder 17094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if decoder is None or self._snapshot is None: 17104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._decoded_chars: 17114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # This should never happen. 17124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise AssertionError("pending decoded text") 17134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return position 17144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Skip backward to the snapshot point (see _read_chunk). 17164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dec_flags, next_input = self._snapshot 17174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao position -= len(next_input) 17184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # How many decoded characters have been used up since the snapshot? 17204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chars_to_skip = self._decoded_chars_used 17214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if chars_to_skip == 0: 17224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # We haven't moved from the snapshot point. 17234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._pack_cookie(position, dec_flags) 17244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Starting from the snapshot position, we will walk the decoder 17264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # forward until it gives us enough decoded characters. 17274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao saved_state = decoder.getstate() 17284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 17294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Note our initial start point. 17304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao decoder.setstate((b'', dec_flags)) 17314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start_pos = position 17324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0 17334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao need_eof = 0 17344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Feed the decoder one byte at a time. As we go, note the 17364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # nearest "safe start point" before the current location 17374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # (a point where the decoder has nothing buffered, so seek() 17384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # can safely start from there and advance to this location). 17394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for next_byte in next_input: 17404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao bytes_fed += 1 17414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chars_decoded += len(decoder.decode(next_byte)) 17424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao dec_buffer, dec_flags = decoder.getstate() 17434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not dec_buffer and chars_decoded <= chars_to_skip: 17444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Decoder buffer is empty, so this is a safe start point. 17454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start_pos += bytes_fed 17464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chars_to_skip -= chars_decoded 17474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0 17484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if chars_decoded >= chars_to_skip: 17494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 17504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 17514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # We didn't get enough decoded data; signal EOF to get more. 17524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao chars_decoded += len(decoder.decode(b'', final=True)) 17534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao need_eof = 1 17544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if chars_decoded < chars_to_skip: 17554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("can't reconstruct logical file position") 17564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The returned cookie corresponds to the last safe start point. 17584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._pack_cookie( 17594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start_pos, start_flags, bytes_fed, need_eof, chars_to_skip) 17604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao finally: 17614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao decoder.setstate(saved_state) 17624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def truncate(self, pos=None): 17644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 17654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos is None: 17664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = self.tell() 17674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.buffer.truncate(pos) 17684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def detach(self): 17704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.buffer is None: 17714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("buffer is already detached") 17724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 17734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao buffer = self._buffer 17744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._buffer = None 17754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return buffer 17764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 17774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def seek(self, cookie, whence=0): 17784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 17794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("tell on closed file") 17804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self._seekable: 17814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("underlying stream is not seekable") 17824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if whence == 1: # seek relative to current position 17834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if cookie != 0: 17844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("can't do nonzero cur-relative seeks") 17854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Seeking to the current position should attempt to 17864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # sync the underlying buffer with the current position. 17874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao whence = 0 17884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao cookie = self.tell() 17894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if whence == 2: # seek relative to end of file 17904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if cookie != 0: 17914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("can't do nonzero end-relative seeks") 17924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 17934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao position = self.buffer.seek(0, 2) 17944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._set_decoded_chars('') 17954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = None 17964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._decoder: 17974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoder.reset() 17984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return position 17994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if whence != 0: 18004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("invalid whence (%r, should be 0, 1 or 2)" % 18014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao (whence,)) 18024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if cookie < 0: 18034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("negative seek position %r" % (cookie,)) 18044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 18054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The strategy of seek() is to go back to the safe start point 18074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # and replay the effect of read(chars_to_skip) from there. 18084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start_pos, dec_flags, bytes_to_feed, need_eof, chars_to_skip = \ 18094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unpack_cookie(cookie) 18104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Seek back to the safe start point. 18124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.buffer.seek(start_pos) 18134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._set_decoded_chars('') 18144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = None 18154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Restore the decoder to its state from the safe start point. 18174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if cookie == 0 and self._decoder: 18184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoder.reset() 18194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif self._decoder or dec_flags or chars_to_skip: 18204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoder = self._decoder or self._get_decoder() 18214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoder.setstate((b'', dec_flags)) 18224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = (dec_flags, b'') 18234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if chars_to_skip: 18254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Just like _read_chunk, feed the decoder and save a snapshot. 18264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao input_chunk = self.buffer.read(bytes_to_feed) 18274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._set_decoded_chars( 18284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoder.decode(input_chunk, need_eof)) 18294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = (dec_flags, input_chunk) 18304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Skip chars_to_skip of the decoded characters. 18324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if len(self._decoded_chars) < chars_to_skip: 18334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise IOError("can't restore logical file position") 18344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._decoded_chars_used = chars_to_skip 18354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Finally, reset the encoder (merely useful for proper BOM handling) 18374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 18384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoder = self._encoder or self._get_encoder() 18394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except LookupError: 18404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Sometimes the encoder doesn't exist 18414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pass 18424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 18434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if cookie != 0: 18444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoder.setstate(0) 18454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 18464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoder.reset() 18474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return cookie 18484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def read(self, n=None): 18504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._checkReadable() 18514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n is None: 18524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n = -1 18534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao decoder = self._decoder or self._get_decoder() 18544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao try: 18554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao n.__index__ 18564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao except AttributeError: 18574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("an integer is required") 18584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if n < 0: 18594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Read everything. 18604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao result = (self._get_decoded_chars() + 18614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao decoder.decode(self.buffer.read(), final=True)) 18624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._set_decoded_chars('') 18634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = None 18644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return result 18654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 18664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Keep reading chunks until we have n characters to return. 18674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao eof = False 18684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao result = self._get_decoded_chars(n) 18694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while len(result) < n and not eof: 18704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao eof = not self._read_chunk() 18714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao result += self._get_decoded_chars(n - len(result)) 18724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return result 18734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def next(self): 18754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._telling = False 18764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line = self.readline() 18774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not line: 18784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = None 18794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._telling = self._seekable 18804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise StopIteration 18814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return line 18824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def readline(self, limit=None): 18844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self.closed: 18854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise ValueError("read from closed file") 18864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if limit is None: 18874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao limit = -1 18884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif not isinstance(limit, (int, long)): 18894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError("limit must be an integer") 18904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Grab all the decoded text (we will rewind any extra bits later). 18924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line = self._get_decoded_chars() 18934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start = 0 18954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Make the decoder if it doesn't already exist. 18964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not self._decoder: 18974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._get_decoder() 18984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 18994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = endpos = None 19004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while True: 19014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._readtranslate: 19024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Newlines are already translated, only search for \n 19034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = line.find('\n', start) 19044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos >= 0: 19054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = pos + 1 19064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 19084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start = len(line) 19094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif self._readuniversal: 19114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Universal newline search. Find any of \r, \r\n, \n 19124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # The decoder ensures that \r\n are not split in two pieces 19134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # In C we'd look for these in parallel of course. 19154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao nlpos = line.find("\n", start) 19164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao crpos = line.find("\r", start) 19174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if crpos == -1: 19184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if nlpos == -1: 19194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Nothing found 19204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start = len(line) 19214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 19224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Found \n 19234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = nlpos + 1 19244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif nlpos == -1: 19264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Found lone \r 19274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = crpos + 1 19284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif nlpos < crpos: 19304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Found \n 19314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = nlpos + 1 19324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif nlpos == crpos + 1: 19344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Found \r\n 19354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = crpos + 2 19364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 19384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Found \r 19394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = crpos + 1 19404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 19424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # non-universal 19434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao pos = line.find(self._readnl) 19444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if pos >= 0: 19454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = pos + len(self._readnl) 19464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if limit >= 0 and len(line) >= limit: 19494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = limit # reached length limit 19504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # No line ending seen yet - get more data' 19534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while self._read_chunk(): 19544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._decoded_chars: 19554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao break 19564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if self._decoded_chars: 19574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao line += self._get_decoded_chars() 19584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 19594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # end of file 19604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._set_decoded_chars('') 19614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._snapshot = None 19624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return line 19634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if limit >= 0 and endpos > limit: 19654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao endpos = limit # don't exceed limit 19664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Rewind _decoded_chars to just after the line ending we found. 19684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._rewind_decoded_chars(len(line) - endpos) 19694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return line[:endpos] 19704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 19724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def newlines(self): 19734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self._decoder.newlines if self._decoder else None 19744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass StringIO(TextIOWrapper): 19774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Text I/O implementation using an in-memory buffer. 19784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao The initial_value argument sets the value of object. The newline 19804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao argument is like the one of TextIOWrapper's constructor. 19814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 19824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, initial_value="", newline="\n"): 19844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao super(StringIO, self).__init__(BytesIO(), 19854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao encoding="utf-8", 19864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errors="strict", 19874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao newline=newline) 19884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # Issue #5645: make universal newlines semantics the same as in the 19894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # C version, even under Windows. 19904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if newline is None: 19914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._writetranslate = False 19924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if initial_value: 19934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isinstance(initial_value, unicode): 19944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao initial_value = unicode(initial_value) 19954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.write(initial_value) 19964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.seek(0) 19974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 19984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def getvalue(self): 19994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.flush() 20004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.buffer.getvalue().decode(self._encoding, self._errors) 20014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 20024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __repr__(self): 20034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # TextIOWrapper tells the encoding in its repr. In StringIO, 20044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # that's a implementation detail. 20054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return object.__repr__(self) 20064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 20074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 20084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def errors(self): 20094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return None 20104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 20114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao @property 20124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def encoding(self): 20134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return None 20144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 20154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def detach(self): 20164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # This doesn't make sense on StringIO. 20174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self._unsupported("detach") 2018