183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh""" 283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehPython implementation of the io module. 383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh""" 483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom __future__ import (print_function, unicode_literals) 683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport os 883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport abc 983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport codecs 1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport warnings 1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport errno 1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Import thread instead of threading to reduce startup cost 1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehtry: 1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from thread import allocate_lock as Lock 1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehexcept ImportError: 1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from dummy_thread import allocate_lock as Lock 1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport io 1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END) 2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom errno import EINTR 2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__metaclass__ = type 2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# open() uses st_blksize whenever we can 2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDEFAULT_BUFFER_SIZE = 8 * 1024 # bytes 2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# NOTE: Base classes defined here are registered with the "official" ABCs 2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# defined in io.py. We don't use real inheritance though, because we don't 2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# want to inherit the C implementations. 3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BlockingIOError(IOError): 3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Exception raised when I/O would block on a non-blocking I/O stream.""" 3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, errno, strerror, characters_written=0): 3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh super(IOError, self).__init__(errno, strerror) 3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(characters_written, (int, long)): 3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("characters_written must be a integer") 4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.characters_written = characters_written 4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef open(file, mode="r", buffering=-1, 4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoding=None, errors=None, 4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh newline=None, closefd=True): 4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh r"""Open file and return a stream. Raise IOError upon failure. 4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh file is either a text or byte string giving the name (and the path 5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if the file isn't in the current working directory) of the file to 5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh be opened or an integer file descriptor of the file to be 5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh wrapped. (If a file descriptor is given, it is closed when the 5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh returned I/O object is closed, unless closefd is set to False.) 5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh mode is an optional string that specifies the mode in which the file 5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh is opened. It defaults to 'r' which means open for reading in text 5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh mode. Other common values are 'w' for writing (truncating the file if 5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh it already exists), and 'a' for appending (which on some Unix systems, 5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh means that all writes append to the end of the file regardless of the 6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh current seek position). In text mode, if encoding is not specified the 6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoding used is platform dependent. (For reading and writing raw 6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh bytes use binary mode and leave encoding unspecified.) The available 6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh modes are: 6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ========= =============================================================== 6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Character Meaning 6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh --------- --------------------------------------------------------------- 6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'r' open for reading (default) 6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'w' open for writing, truncating the file first 7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'a' open for writing, appending to the end of the file if it exists 7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'b' binary mode 7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 't' text mode (default) 7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh '+' open a disk file for updating (reading and writing) 7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'U' universal newline mode (for backwards compatibility; unneeded 7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh for new code) 7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ========= =============================================================== 7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The default mode is 'rt' (open for reading text). For binary random 7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh access, the mode 'w+b' opens and truncates the file to 0 bytes, while 8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'r+b' opens the file without truncation. 8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Python distinguishes between files opened in binary and text modes, 8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh even when the underlying operating system doesn't. Files opened in 8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh binary mode (appending 'b' to the mode argument) return contents as 8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh bytes objects without any decoding. In text mode (the default, or when 8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 't' is appended to the mode argument), the contents of the file are 8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh returned as strings, the bytes having been first decoded using a 8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh platform-dependent encoding or using the specified encoding if given. 8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffering is an optional integer used to set the buffering policy. 9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Pass 0 to switch buffering off (only allowed in binary mode), 1 to select 9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh line buffering (only usable in text mode), and an integer > 1 to indicate 9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh the size of a fixed-size chunk buffer. When no buffering argument is 9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh given, the default buffering policy works as follows: 9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh * Binary files are buffered in fixed-size chunks; the size of the buffer 9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh is chosen using a heuristic trying to determine the underlying device's 9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "block size" and falling back on `io.DEFAULT_BUFFER_SIZE`. 9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh On many systems, the buffer will typically be 4096 or 8192 bytes long. 10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh * "Interactive" text files (files for which isatty() returns True) 10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh use line buffering. Other text files use the policy described above 10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh for binary files. 10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoding is the name of the encoding used to decode or encode the 10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh file. This should only be used in text mode. The default encoding is 10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh platform dependent, but any encoding supported by Python can be 10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh passed. See the codecs module for the list of supported encodings. 10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh errors is an optional string that specifies how encoding errors are to 11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh be handled---this argument should not be used in binary mode. Pass 11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'strict' to raise a ValueError exception if there is an encoding error 11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (the default of None has the same effect), or pass 'ignore' to ignore 11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh errors. (Note that ignoring encoding errors can lead to data loss.) 11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh See the documentation for codecs.register for a list of the permitted 11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoding error strings. 11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh newline controls how universal newlines works (it only applies to text 11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh mode). It can be None, '', '\n', '\r', and '\r\n'. It works as 12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh follows: 12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh * On input, if newline is None, universal newlines mode is 12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh enabled. Lines in the input can end in '\n', '\r', or '\r\n', and 12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh these are translated into '\n' before being returned to the 12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh caller. If it is '', universal newline mode is enabled, but line 12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endings are returned to the caller untranslated. If it has any of 12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh the other legal values, input lines are only terminated by the given 12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh string, and the line ending is returned to the caller untranslated. 12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh * On output, if newline is None, any '\n' characters written are 13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh translated to the system default line separator, os.linesep. If 13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh newline is '', no translation takes place. If newline is any of the 13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh other legal values, any '\n' characters written are translated to 13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh the given string. 13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If closefd is False, the underlying file descriptor will be kept open 13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh when the file is closed. This does not work when a file name is given 13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh and must be True in that case. 13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh open() returns a file object whose type depends on the mode, and 14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh through which the standard file operations such as reading and writing 14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh are performed. When open() is used to open a file in a text mode ('w', 14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open 14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh a file in a binary mode, the returned class varies: in read binary 14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh mode, it returns a BufferedReader; in write binary and append binary 14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh modes, it returns a BufferedWriter, and in read/write mode, it returns 14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh a BufferedRandom. 14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh It is also possible to use a string or bytearray as a file for both 15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh reading and writing. For strings StringIO can be used like a file 15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh opened in a text mode, and for bytes a BytesIO can be used like a file 15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh opened in a binary mode. 15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(file, (basestring, int, long)): 15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("invalid file: %r" % file) 15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(mode, basestring): 15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("invalid mode: %r" % mode) 15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(buffering, (int, long)): 15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("invalid buffering: %r" % buffering) 16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if encoding is not None and not isinstance(encoding, basestring): 16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("invalid encoding: %r" % encoding) 16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if errors is not None and not isinstance(errors, basestring): 16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("invalid errors: %r" % errors) 16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh modes = set(mode) 16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if modes - set("arwb+tU") or len(mode) > len(modes): 16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid mode: %r" % mode) 16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh reading = "r" in modes 16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh writing = "w" in modes 16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh appending = "a" in modes 17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh updating = "+" in modes 17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh text = "t" in modes 17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh binary = "b" in modes 17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if "U" in modes: 17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if writing or appending: 17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("can't use U and writing mode at once") 17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh reading = True 17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if text and binary: 17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("can't have text and binary mode at once") 17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if reading + writing + appending > 1: 18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("can't have read/write/append mode at once") 18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not (reading or writing or appending): 18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("must have exactly one of read/write/append mode") 18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if binary and encoding is not None: 18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("binary mode doesn't take an encoding argument") 18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if binary and errors is not None: 18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("binary mode doesn't take an errors argument") 18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if binary and newline is not None: 18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("binary mode doesn't take a newline argument") 18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raw = FileIO(file, 19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (reading and "r" or "") + 19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (writing and "w" or "") + 19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (appending and "a" or "") + 19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (updating and "+" or ""), 19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh closefd) 19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh line_buffering = False 19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if buffering == 1 or buffering < 0 and raw.isatty(): 19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffering = -1 19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh line_buffering = True 19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if buffering < 0: 20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffering = DEFAULT_BUFFER_SIZE 20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh bs = os.fstat(raw.fileno()).st_blksize 20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except (os.error, AttributeError): 20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pass 20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if bs > 1: 20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffering = bs 20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if buffering < 0: 20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid buffering size") 21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if buffering == 0: 21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if binary: 21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return raw 21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("can't have unbuffered text I/O") 21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if updating: 21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffer = BufferedRandom(raw, buffering) 21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif writing or appending: 21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffer = BufferedWriter(raw, buffering) 21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif reading: 21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffer = BufferedReader(raw, buffering) 22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("unknown mode: %r" % mode) 22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if binary: 22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return buffer 22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering) 22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh text.mode = mode 22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return text 22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass DocDescriptor: 23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Helper for builtins.open.__doc__ 23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __get__(self, obj, typ): 23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return ( 23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "open(file, mode='r', buffering=-1, encoding=None, " 23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "errors=None, newline=None, closefd=True)\n\n" + 23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh open.__doc__) 23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass OpenWrapper: 23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Wrapper for builtins.open 24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Trick so that open won't become a bound method when stored 24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh as a class variable (as dbm.dumb does). 24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh See initstdio() in Python/pythonrun.c. 24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh __doc__ = DocDescriptor() 24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __new__(cls, *args, **kwargs): 24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return open(*args, **kwargs) 25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass UnsupportedOperation(ValueError, IOError): 25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pass 25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass IOBase: 25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh __metaclass__ = abc.ABCMeta 25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """The abstract base class for all I/O classes, acting on streams of 26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh bytes. There is no public constructor. 26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh This class provides dummy implementations for many methods that 26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh derived classes can override selectively; the default implementations 26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh represent a file that cannot be read, written or seeked. 26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Even though IOBase does not declare read, readinto, or write because 26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh their signatures will vary, implementations and clients should 26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh consider those methods part of the interface. Also, implementations 26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh may raise a IOError when operations they do not support are called. 27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The basic type used for binary data read from or written to a file is 27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh bytes. bytearrays are accepted too, and in some cases (such as 27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh readinto) needed. Text I/O classes work with str data. 27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Note that calling any method (even inquiries) on a closed stream is 27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh undefined. Implementations may raise IOError in this case. 27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh IOBase (and its subclasses) support the iterator protocol, meaning 27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh that an IOBase object can be iterated over yielding the lines in a 28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh stream. 28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh IOBase also supports the :keyword:`with` statement. In this example, 28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh fp is closed after the suite of the with statement is complete: 28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with open('spam.txt', 'r') as fp: 28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh fp.write('Spam and eggs!') 28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Internal ### 29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _unsupported(self, name): 29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Internal: raise an exception for unsupported operations.""" 29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise UnsupportedOperation("%s.%s() not supported" % 29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (self.__class__.__name__, name)) 29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Positioning ### 29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seek(self, pos, whence=0): 29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Change stream position. 30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Change the stream position to byte offset pos. Argument pos is 30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh interpreted relative to the position indicated by whence. Values 30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh for whence are: 30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh * 0 -- start of stream (the default); offset should be zero or positive 30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh * 1 -- current stream position; offset may be negative 30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh * 2 -- end of stream; offset is usually negative 30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Return the new absolute position. 31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("seek") 31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def tell(self): 31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Return current stream position.""" 31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.seek(0, 1) 31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def truncate(self, pos=None): 31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Truncate file to size bytes. 31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Size defaults to the current IO position as reported by tell(). Return 32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh the new size. 32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("truncate") 32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Flush and close ### 32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def flush(self): 32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Flush write buffers, if applicable. 32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh This is not implemented for read-only and non-blocking streams. 33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._checkClosed() 33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX Should this return the number of bytes written??? 33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh __closed = False 33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def close(self): 33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Flush and close the IO object. 33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh This method has no effect if the file is already closed. 34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not self.__closed: 34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh finally: 34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.__closed = True 34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __del__(self): 34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Destructor. Calls close().""" 35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The try/except block is in case this is called at program 35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # exit time, when it's possible that globals have already been 35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # deleted, and then the close() call might fail. Since 35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # there's nothing we can do about such failures and they annoy 35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # the end users, we suppress the traceback. 35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.close() 35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except: 35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pass 35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Inquiries ### 36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seekable(self): 36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Return whether object supports random access. 36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If False, seek(), tell() and truncate() will raise IOError. 36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh This method may need to do a test seek(). 36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return False 36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _checkSeekable(self, msg=None): 37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Internal: raise an IOError if file is not seekable 37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not self.seekable(): 37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("File or stream is not seekable." 37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if msg is None else msg) 37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readable(self): 37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Return whether object was opened for reading. 38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If False, read() will raise IOError. 38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return False 38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _checkReadable(self, msg=None): 38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Internal: raise an IOError if file is not readable 38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not self.readable(): 38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("File or stream is not readable." 39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if msg is None else msg) 39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 39283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def writable(self): 39383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Return whether object was opened for writing. 39483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 39583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If False, write() and truncate() will raise IOError. 39683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 39783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return False 39883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 39983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _checkWritable(self, msg=None): 40083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Internal: raise an IOError if file is not writable 40183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 40283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not self.writable(): 40383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("File or stream is not writable." 40483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if msg is None else msg) 40583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 40683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 40783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def closed(self): 40883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """closed: bool. True iff the file has been closed. 40983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 41083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh For backwards compatibility, this is a property, not a predicate. 41183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 41283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.__closed 41383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 41483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _checkClosed(self, msg=None): 41583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Internal: raise an ValueError if file is closed 41683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 41783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 41883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("I/O operation on closed file." 41983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if msg is None else msg) 42083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 42183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Context manager ### 42283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 42383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __enter__(self): 42483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Context management protocol. Returns self.""" 42583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._checkClosed() 42683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self 42783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 42883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __exit__(self, *args): 42983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Context management protocol. Calls close()""" 43083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.close() 43183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 43283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Lower-level APIs ### 43383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 43483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX Should these be present even if unimplemented? 43583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 43683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def fileno(self): 43783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Returns underlying file descriptor if one exists. 43883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 43983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh An IOError is raised if the IO object does not use a file descriptor. 44083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 44183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("fileno") 44283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 44383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def isatty(self): 44483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Return whether this is an 'interactive' stream. 44583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 44683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Return False if it can't be determined. 44783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 44883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._checkClosed() 44983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return False 45083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 45183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Readline[s] and writelines ### 45283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 45383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readline(self, limit=-1): 45483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh r"""Read and return a line from the stream. 45583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 45683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If limit is specified, at most limit bytes will be read. 45783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 45883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The line terminator is always b'\n' for binary files; for text 45983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh files, the newlines argument to open can be used to select the line 46083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh terminator(s) recognized. 46183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 46283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # For backwards compatibility, a (slowish) readline(). 46383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if hasattr(self, "peek"): 46483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def nreadahead(): 46583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh readahead = self.peek(1) 46683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not readahead: 46783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return 1 46883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = (readahead.find(b"\n") + 1) or len(readahead) 46983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if limit >= 0: 47083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = min(n, limit) 47183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return n 47283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 47383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def nreadahead(): 47483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return 1 47583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if limit is None: 47683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh limit = -1 47783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif not isinstance(limit, (int, long)): 47883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("limit must be an integer") 47983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh res = bytearray() 48083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while limit < 0 or len(res) < limit: 48183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh b = self.read(nreadahead()) 48283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not b: 48383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 48483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh res += b 48583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if res.endswith(b"\n"): 48683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 48783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return bytes(res) 48883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 48983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __iter__(self): 49083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._checkClosed() 49183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self 49283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 49383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def next(self): 49483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh line = self.readline() 49583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not line: 49683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise StopIteration 49783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return line 49883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 49983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readlines(self, hint=None): 50083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Return a list of lines from the stream. 50183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 50283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh hint can be specified to control the number of lines read: no more 50383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh lines will be read if the total size (in bytes/characters) of all 50483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh lines so far exceeds hint. 50583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 50683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if hint is not None and not isinstance(hint, (int, long)): 50783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("integer or None expected") 50883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if hint is None or hint <= 0: 50983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return list(self) 51083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = 0 51183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh lines = [] 51283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh for line in self: 51383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh lines.append(line) 51483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n += len(line) 51583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n >= hint: 51683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 51783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return lines 51883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 51983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def writelines(self, lines): 52083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._checkClosed() 52183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh for line in lines: 52283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.write(line) 52383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 52483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehio.IOBase.register(IOBase) 52583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 52683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 52783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass RawIOBase(IOBase): 52883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 52983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Base class for raw binary I/O.""" 53083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 53183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The read() method is implemented by calling readinto(); derived 53283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # classes that want to support read() only need to implement 53383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # readinto() as a primitive operation. In general, readinto() can be 53483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # more efficient than read(). 53583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 53683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # (It would be tempting to also provide an implementation of 53783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # readinto() in terms of read(), in case the latter is a more suitable 53883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # primitive operation, but that would lead to nasty recursion in case 53983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # a subclass doesn't implement either.) 54083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 54183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read(self, n=-1): 54283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read and return up to n bytes. 54383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 54483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Returns an empty bytes object on EOF, or None if the object is 54583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh set not to block and has no data to read. 54683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 54783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None: 54883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = -1 54983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n < 0: 55083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.readall() 55183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh b = bytearray(n.__index__()) 55283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = self.readinto(b) 55383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None: 55483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return None 55583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh del b[n:] 55683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return bytes(b) 55783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 55883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readall(self): 55983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read until EOF, using multiple read() call.""" 56083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh res = bytearray() 56183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while True: 56283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data = self.read(DEFAULT_BUFFER_SIZE) 56383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not data: 56483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 56583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh res += data 56683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if res: 56783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return bytes(res) 56883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 56983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # b'' or None 57083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return data 57183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 57283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readinto(self, b): 57383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read up to len(b) bytes into b. 57483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 57583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Returns number of bytes read (0 for EOF), or None if the object 57683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh is set not to block and has no data to read. 57783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 57883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("readinto") 57983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 58083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def write(self, b): 58183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Write the given buffer to the IO stream. 58283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 58383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Returns the number of bytes written, which may be less than len(b). 58483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 58583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("write") 58683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 58783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehio.RawIOBase.register(RawIOBase) 58883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _io import FileIO 58983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehRawIOBase.register(FileIO) 59083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 59183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 59283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedIOBase(IOBase): 59383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 59483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Base class for buffered IO objects. 59583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 59683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The main difference with RawIOBase is that the read() method 59783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh supports omitting the size argument, and does not have a default 59883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh implementation that defers to readinto(). 59983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 60083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh In addition, read(), readinto() and write() may raise 60183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh BlockingIOError if the underlying raw stream is in non-blocking 60283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh mode and not ready; unlike their raw counterparts, they will never 60383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return None. 60483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 60583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh A typical implementation should not inherit from a RawIOBase 60683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh implementation, but wrap one. 60783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 60883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 60983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read(self, n=None): 61083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read and return up to n bytes. 61183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 61283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If the argument is omitted, None, or negative, reads and 61383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh returns all data until EOF. 61483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 61583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If the argument is positive, and the underlying raw stream is 61683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh not 'interactive', multiple raw reads may be issued to satisfy 61783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh the byte count (unless EOF is reached first). But for 61883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh interactive raw streams (XXX and for pipes?), at most one raw 61983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh read will be issued, and a short result does not imply that 62083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh EOF is imminent. 62183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 62283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Returns an empty bytes array on EOF. 62383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 62483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Raises BlockingIOError if the underlying raw stream has no 62583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data at the moment. 62683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 62783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("read") 62883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 62983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read1(self, n=None): 63083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read up to n bytes with at most one read() system call.""" 63183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("read1") 63283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 63383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readinto(self, b): 63483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read up to len(b) bytes into b. 63583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 63683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Like read(), this may issue multiple reads to the underlying raw 63783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh stream, unless the latter is 'interactive'. 63883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 63983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Returns the number of bytes read (0 for EOF). 64083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 64183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Raises BlockingIOError if the underlying raw stream has no 64283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data at the moment. 64383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 64483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX This ought to work with anything that supports the buffer API 64583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh data = self.read(len(b)) 64683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = len(data) 64783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 64883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh b[:n] = data 64983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except TypeError as err: 65083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh import array 65183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(b, array.array): 65283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise err 65383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh b[:n] = array.array(b'b', data) 65483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return n 65583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 65683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def write(self, b): 65783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Write the given buffer to the IO stream. 65883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 65983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Return the number of bytes written, which is never less than 66083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh len(b). 66183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 66283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Raises BlockingIOError if the buffer is full and the 66383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh underlying raw stream cannot accept more data at the moment. 66483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 66583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("write") 66683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 66783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def detach(self): 66883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 66983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Separate the underlying raw stream from the buffer and return it. 67083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 67183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh After the raw stream has been detached, the buffer is in an unusable 67283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh state. 67383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 67483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("detach") 67583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 67683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehio.BufferedIOBase.register(BufferedIOBase) 67783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 67883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 67983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass _BufferedIOMixin(BufferedIOBase): 68083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 68183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """A mixin implementation of BufferedIOBase with an underlying raw stream. 68283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 68383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh This passes most requests on to the underlying raw stream. It 68483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh does *not* provide implementations of read(), readinto() or 68583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh write(). 68683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 68783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 68883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, raw): 68983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._raw = raw 69083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 69183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Positioning ### 69283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 69383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seek(self, pos, whence=0): 69483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh new_position = self.raw.seek(pos, whence) 69583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if new_position < 0: 69683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("seek() returned an invalid position") 69783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return new_position 69883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 69983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def tell(self): 70083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self.raw.tell() 70183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos < 0: 70283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("tell() returned an invalid position") 70383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return pos 70483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 70583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def truncate(self, pos=None): 70683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Flush the stream. We're mixing buffered I/O with lower-level I/O, 70783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # and a flush may be necessary to synch both views of the current 70883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # file state. 70983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 71083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 71183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos is None: 71283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self.tell() 71383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX: Should seek() be used, instead of passing the position 71483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX directly to truncate? 71583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.truncate(pos) 71683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 71783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Flush and close ### 71883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 71983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def flush(self): 72083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 72183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("flush of closed file") 72283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.raw.flush() 72383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 72483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def close(self): 72583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.raw is not None and not self.closed: 72683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 72783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # may raise BlockingIOError or BrokenPipeError etc 72883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 72983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh finally: 73083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.raw.close() 73183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 73283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def detach(self): 73383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.raw is None: 73483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("raw stream already detached") 73583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 73683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raw = self._raw 73783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._raw = None 73883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return raw 73983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 74083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Inquiries ### 74183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 74283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seekable(self): 74383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.seekable() 74483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 74583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readable(self): 74683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.readable() 74783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 74883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def writable(self): 74983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.writable() 75083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 75183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 75283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def raw(self): 75383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._raw 75483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 75583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 75683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def closed(self): 75783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.closed 75883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 75983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 76083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def name(self): 76183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.name 76283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 76383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 76483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def mode(self): 76583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.mode 76683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 76783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __repr__(self): 76883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh clsname = self.__class__.__name__ 76983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 77083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh name = self.name 77183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except AttributeError: 77283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "<_pyio.{0}>".format(clsname) 77383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 77483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "<_pyio.{0} name={1!r}>".format(clsname, name) 77583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 77683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ### Lower-level APIs ### 77783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 77883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def fileno(self): 77983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.fileno() 78083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 78183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def isatty(self): 78283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.isatty() 78383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 78483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 78583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BytesIO(BufferedIOBase): 78683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 78783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Buffered I/O implementation using an in-memory bytes buffer.""" 78883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 78983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, initial_bytes=None): 79083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf = bytearray() 79183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if initial_bytes is not None: 79283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf.extend(initial_bytes) 79383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._buffer = buf 79483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._pos = 0 79583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 79683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __getstate__(self): 79783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 79883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("__getstate__ on closed file") 79983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.__dict__.copy() 80083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 80183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def getvalue(self): 80283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Return the bytes value (contents) of the buffer 80383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 80483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 80583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("getvalue on closed file") 80683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return bytes(self._buffer) 80783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 80883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read(self, n=None): 80983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 81083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("read from closed file") 81183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None: 81283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = -1 81383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(n, (int, long)): 81483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("integer argument expected, got {0!r}".format( 81583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh type(n))) 81683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n < 0: 81783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = len(self._buffer) 81883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if len(self._buffer) <= self._pos: 81983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return b"" 82083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh newpos = min(len(self._buffer), self._pos + n) 82183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh b = self._buffer[self._pos : newpos] 82283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._pos = newpos 82383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return bytes(b) 82483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 82583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read1(self, n): 82683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """This is the same as read. 82783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 82883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.read(n) 82983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 83083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def write(self, b): 83183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 83283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("write to closed file") 83383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if isinstance(b, unicode): 83483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("can't write unicode to binary stream") 83583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = len(b) 83683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n == 0: 83783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return 0 83883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self._pos 83983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos > len(self._buffer): 84083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Inserts null bytes between the current end of the file 84183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # and the new write position. 84283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh padding = b'\x00' * (pos - len(self._buffer)) 84383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._buffer += padding 84483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._buffer[pos:pos + n] = b 84583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._pos += n 84683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return n 84783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 84883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seek(self, pos, whence=0): 84983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 85083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("seek on closed file") 85183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 85283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos.__index__ 85383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except AttributeError: 85483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("an integer is required") 85583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if whence == 0: 85683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos < 0: 85783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("negative seek position %r" % (pos,)) 85883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._pos = pos 85983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif whence == 1: 86083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._pos = max(0, self._pos + pos) 86183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif whence == 2: 86283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._pos = max(0, len(self._buffer) + pos) 86383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 86483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid whence value") 86583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._pos 86683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 86783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def tell(self): 86883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 86983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("tell on closed file") 87083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._pos 87183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 87283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def truncate(self, pos=None): 87383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 87483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("truncate on closed file") 87583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos is None: 87683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self._pos 87783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 87883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 87983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos.__index__ 88083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except AttributeError: 88183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("an integer is required") 88283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos < 0: 88383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("negative truncate position %r" % (pos,)) 88483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh del self._buffer[pos:] 88583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return pos 88683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 88783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readable(self): 88883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 88983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("I/O operation on closed file.") 89083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return True 89183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 89283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def writable(self): 89383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 89483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("I/O operation on closed file.") 89583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return True 89683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 89783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seekable(self): 89883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 89983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("I/O operation on closed file.") 90083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return True 90183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 90283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 90383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedReader(_BufferedIOMixin): 90483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 90583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """BufferedReader(raw[, buffer_size]) 90683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 90783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh A buffer for a readable, sequential BaseRawIO object. 90883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 90983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The constructor creates a BufferedReader for the given readable raw 91083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE 91183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh is used. 91283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 91383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 91483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE): 91583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Create a new buffered reader using the given readable raw IO object. 91683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 91783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not raw.readable(): 91883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError('"raw" argument must be readable.') 91983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 92083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _BufferedIOMixin.__init__(self, raw) 92183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if buffer_size <= 0: 92283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid buffer size") 92383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.buffer_size = buffer_size 92483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._reset_read_buf() 92583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._read_lock = Lock() 92683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 92783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _reset_read_buf(self): 92883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._read_buf = b"" 92983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._read_pos = 0 93083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 93183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read(self, n=None): 93283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read n bytes. 93383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 93483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Returns exactly n bytes of data unless the underlying raw IO 93583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh stream reaches EOF or if the call would block in non-blocking 93683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh mode. If n is negative, read until EOF or until read() would 93783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh block. 93883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 93983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is not None and n < -1: 94083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid number of bytes to read") 94183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._read_lock: 94283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._read_unlocked(n) 94383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 94483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _read_unlocked(self, n=None): 94583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh nodata_val = b"" 94683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh empty_values = (b"", None) 94783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf = self._read_buf 94883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self._read_pos 94983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 95083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Special case for when the number of bytes to read is unspecified. 95183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None or n == -1: 95283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._reset_read_buf() 95383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chunks = [buf[pos:]] # Strip the consumed bytes. 95483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh current_size = 0 95583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while True: 95683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Read until EOF or until read() would block. 95783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 95883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chunk = self.raw.read() 95983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except IOError as e: 96083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if e.errno != EINTR: 96183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise 96283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh continue 96383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if chunk in empty_values: 96483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh nodata_val = chunk 96583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 96683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh current_size += len(chunk) 96783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chunks.append(chunk) 96883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return b"".join(chunks) or nodata_val 96983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 97083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The number of bytes to read is specified, return at most n bytes. 97183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh avail = len(buf) - pos # Length of the available buffered data. 97283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n <= avail: 97383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Fast path: the data to read is fully buffered. 97483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._read_pos += n 97583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return buf[pos:pos+n] 97683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Slow path: read from the stream until enough bytes are read, 97783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # or until an EOF occurs or until read() would block. 97883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chunks = [buf[pos:]] 97983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh wanted = max(self.buffer_size, n) 98083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while avail < n: 98183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 98283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chunk = self.raw.read(wanted) 98383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except IOError as e: 98483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if e.errno != EINTR: 98583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise 98683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh continue 98783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if chunk in empty_values: 98883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh nodata_val = chunk 98983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 99083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh avail += len(chunk) 99183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chunks.append(chunk) 99283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # n is more then avail only when an EOF occurred or when 99383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # read() would have blocked. 99483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = min(n, avail) 99583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh out = b"".join(chunks) 99683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._read_buf = out[n:] # Save the extra data in the buffer. 99783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._read_pos = 0 99883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return out[:n] if out else nodata_val 99983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 100083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def peek(self, n=0): 100183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Returns buffered bytes without advancing the position. 100283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 100383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The argument indicates a desired minimal number of bytes; we 100483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh do at most one raw read to satisfy it. We never return more 100583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh than self.buffer_size. 100683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 100783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._read_lock: 100883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._peek_unlocked(n) 100983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 101083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _peek_unlocked(self, n=0): 101183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh want = min(n, self.buffer_size) 101283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh have = len(self._read_buf) - self._read_pos 101383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if have < want or have <= 0: 101483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh to_read = self.buffer_size - have 101583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while True: 101683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 101783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh current = self.raw.read(to_read) 101883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except IOError as e: 101983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if e.errno != EINTR: 102083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise 102183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh continue 102283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 102383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if current: 102483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._read_buf = self._read_buf[self._read_pos:] + current 102583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._read_pos = 0 102683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._read_buf[self._read_pos:] 102783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 102883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read1(self, n): 102983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Reads up to n bytes, with at most one read() system call.""" 103083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Returns up to n bytes. If at least one byte is buffered, we 103183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # only return buffered bytes. Otherwise, we do one raw read. 103283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n < 0: 103383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("number of bytes to read must be positive") 103483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n == 0: 103583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return b"" 103683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._read_lock: 103783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._peek_unlocked(1) 103883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._read_unlocked( 103983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh min(n, len(self._read_buf) - self._read_pos)) 104083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 104183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def tell(self): 104283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return _BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos 104383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 104483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seek(self, pos, whence=0): 104583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not (0 <= whence <= 2): 104683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid whence value") 104783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._read_lock: 104883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if whence == 1: 104983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos -= len(self._read_buf) - self._read_pos 105083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = _BufferedIOMixin.seek(self, pos, whence) 105183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._reset_read_buf() 105283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return pos 105383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 105483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedWriter(_BufferedIOMixin): 105583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 105683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """A buffer for a writeable sequential RawIO object. 105783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 105883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The constructor creates a BufferedWriter for the given writeable raw 105983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh stream. If the buffer_size is not given, it defaults to 106083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh DEFAULT_BUFFER_SIZE. 106183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 106283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 106383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _warning_stack_offset = 2 106483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 106583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, raw, 106683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): 106783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not raw.writable(): 106883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError('"raw" argument must be writable.') 106983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 107083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _BufferedIOMixin.__init__(self, raw) 107183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if buffer_size <= 0: 107283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid buffer size") 107383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if max_buffer_size is not None: 107483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 107583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._warning_stack_offset) 107683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.buffer_size = buffer_size 107783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._write_buf = bytearray() 107883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._write_lock = Lock() 107983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 108083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def write(self, b): 108183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 108283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("write to closed file") 108383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if isinstance(b, unicode): 108483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("can't write unicode to binary stream") 108583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._write_lock: 108683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX we can implement some more tricks to try and avoid 108783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # partial writes 108883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if len(self._write_buf) > self.buffer_size: 108983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # We're full, so let's pre-flush the buffer. (This may 109083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # raise BlockingIOError with characters_written == 0.) 109183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._flush_unlocked() 109283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh before = len(self._write_buf) 109383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._write_buf.extend(b) 109483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh written = len(self._write_buf) - before 109583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if len(self._write_buf) > self.buffer_size: 109683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 109783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._flush_unlocked() 109883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except BlockingIOError as e: 109983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if len(self._write_buf) > self.buffer_size: 110083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # We've hit the buffer_size. We have to accept a partial 110183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # write and cut back our buffer. 110283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh overage = len(self._write_buf) - self.buffer_size 110383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh written -= overage 110483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._write_buf = self._write_buf[:self.buffer_size] 110583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise BlockingIOError(e.errno, e.strerror, written) 110683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return written 110783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 110883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def truncate(self, pos=None): 110983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._write_lock: 111083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._flush_unlocked() 111183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos is None: 111283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self.raw.tell() 111383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.raw.truncate(pos) 111483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 111583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def flush(self): 111683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._write_lock: 111783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._flush_unlocked() 111883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 111983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _flush_unlocked(self): 112083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 112183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("flush of closed file") 112283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while self._write_buf: 112383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 112483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = self.raw.write(self._write_buf) 112583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except BlockingIOError: 112683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise RuntimeError("self.raw should implement RawIOBase: it " 112783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "should not raise BlockingIOError") 112883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except IOError as e: 112983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if e.errno != EINTR: 113083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise 113183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh continue 113283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None: 113383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise BlockingIOError( 113483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh errno.EAGAIN, 113583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "write could not complete without blocking", 0) 113683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n > len(self._write_buf) or n < 0: 113783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("write() returned incorrect number of bytes") 113883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh del self._write_buf[:n] 113983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 114083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def tell(self): 114183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return _BufferedIOMixin.tell(self) + len(self._write_buf) 114283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 114383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seek(self, pos, whence=0): 114483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not (0 <= whence <= 2): 114583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid whence") 114683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._write_lock: 114783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._flush_unlocked() 114883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return _BufferedIOMixin.seek(self, pos, whence) 114983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 115083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 115183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedRWPair(BufferedIOBase): 115283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 115383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """A buffered reader and writer object together. 115483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 115583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh A buffered reader object and buffered writer object put together to 115683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh form a sequential IO object that can read and write. This is typically 115783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh used with a socket or two-way pipe. 115883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 115983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh reader and writer are RawIOBase objects that are readable and 116083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh writeable respectively. If the buffer_size is omitted it defaults to 116183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh DEFAULT_BUFFER_SIZE. 116283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 116383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 116483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX The usefulness of this (compared to having two separate IO 116583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # objects) is questionable. 116683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 116783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, reader, writer, 116883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): 116983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Constructor. 117083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 117183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The arguments are two RawIO instances. 117283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 117383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if max_buffer_size is not None: 117483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2) 117583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 117683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not reader.readable(): 117783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError('"reader" argument must be readable.') 117883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 117983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not writer.writable(): 118083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError('"writer" argument must be writable.') 118183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 118283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.reader = BufferedReader(reader, buffer_size) 118383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.writer = BufferedWriter(writer, buffer_size) 118483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 118583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read(self, n=None): 118683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None: 118783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = -1 118883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.reader.read(n) 118983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 119083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readinto(self, b): 119183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.reader.readinto(b) 119283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 119383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def write(self, b): 119483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.writer.write(b) 119583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 119683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def peek(self, n=0): 119783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.reader.peek(n) 119883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 119983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read1(self, n): 120083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.reader.read1(n) 120183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 120283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readable(self): 120383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.reader.readable() 120483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 120583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def writable(self): 120683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.writer.writable() 120783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 120883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def flush(self): 120983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.writer.flush() 121083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 121183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def close(self): 121283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.writer.close() 121383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.reader.close() 121483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 121583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def isatty(self): 121683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.reader.isatty() or self.writer.isatty() 121783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 121883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 121983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def closed(self): 122083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.writer.closed 122183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 122283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 122383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass BufferedRandom(BufferedWriter, BufferedReader): 122483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 122583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """A buffered interface to random access streams. 122683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 122783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The constructor creates a reader and writer for a seekable stream, 122883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raw, given in the first argument. If the buffer_size is omitted it 122983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh defaults to DEFAULT_BUFFER_SIZE. 123083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 123183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 123283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _warning_stack_offset = 3 123383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 123483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, raw, 123583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): 123683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raw._checkSeekable() 123783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh BufferedReader.__init__(self, raw, buffer_size) 123883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size) 123983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 124083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seek(self, pos, whence=0): 124183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not (0 <= whence <= 2): 124283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid whence") 124383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 124483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._read_buf: 124583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Undo read ahead. 124683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._read_lock: 124783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.raw.seek(self._read_pos - len(self._read_buf), 1) 124883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # First do the raw seek, then empty the read buffer, so that 124983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # if the raw seek fails, we don't lose buffered data forever. 125083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self.raw.seek(pos, whence) 125183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._read_lock: 125283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._reset_read_buf() 125383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos < 0: 125483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("seek() returned invalid position") 125583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return pos 125683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 125783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def tell(self): 125883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._write_buf: 125983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return BufferedWriter.tell(self) 126083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 126183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return BufferedReader.tell(self) 126283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 126383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def truncate(self, pos=None): 126483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos is None: 126583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self.tell() 126683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Use seek to flush the read buffer. 126783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return BufferedWriter.truncate(self, pos) 126883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 126983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read(self, n=None): 127083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None: 127183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = -1 127283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 127383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return BufferedReader.read(self, n) 127483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 127583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readinto(self, b): 127683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 127783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return BufferedReader.readinto(self, b) 127883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 127983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def peek(self, n=0): 128083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 128183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return BufferedReader.peek(self, n) 128283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 128383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read1(self, n): 128483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 128583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return BufferedReader.read1(self, n) 128683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 128783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def write(self, b): 128883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._read_buf: 128983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Undo readahead 129083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh with self._read_lock: 129183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.raw.seek(self._read_pos - len(self._read_buf), 1) 129283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._reset_read_buf() 129383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return BufferedWriter.write(self, b) 129483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 129583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 129683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TextIOBase(IOBase): 129783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 129883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Base class for text I/O. 129983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 130083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh This class provides a character and line based interface to stream 130183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh I/O. There is no readinto method because Python's character strings 130283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh are immutable. There is no public constructor. 130383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 130483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 130583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read(self, n=-1): 130683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read at most n characters from stream. 130783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 130883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Read from underlying buffer until we have n characters or we hit EOF. 130983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If n is negative or omitted, read until EOF. 131083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 131183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("read") 131283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 131383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def write(self, s): 131483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Write string s to stream.""" 131583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("write") 131683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 131783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def truncate(self, pos=None): 131883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Truncate size to pos.""" 131983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("truncate") 132083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 132183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readline(self): 132283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Read until newline or EOF. 132383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 132483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Returns an empty string if EOF is hit immediately. 132583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 132683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("readline") 132783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 132883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def detach(self): 132983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 133083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Separate the underlying buffer from the TextIOBase and return it. 133183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 133283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh After the underlying buffer has been detached, the TextIO is in an 133383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh unusable state. 133483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 133583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("detach") 133683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 133783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 133883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def encoding(self): 133983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Subclasses should override.""" 134083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return None 134183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 134283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 134383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def newlines(self): 134483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Line endings translated so far. 134583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 134683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Only line endings translated during reading are considered. 134783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 134883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Subclasses should override. 134983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 135083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return None 135183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 135283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 135383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def errors(self): 135483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Error setting of the decoder or encoder. 135583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 135683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Subclasses should override.""" 135783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return None 135883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 135983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehio.TextIOBase.register(TextIOBase) 136083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 136183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 136283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass IncrementalNewlineDecoder(codecs.IncrementalDecoder): 136383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh r"""Codec used when reading a file in universal newlines mode. It wraps 136483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh another incremental decoder, translating \r\n and \r into \n. It also 136583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh records the types of newlines encountered. When used with 136683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh translate=False, it ensures that the newline sequence is returned in 136783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh one piece. 136883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 136983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, decoder, translate, errors='strict'): 137083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh codecs.IncrementalDecoder.__init__(self, errors=errors) 137183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.translate = translate 137283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.decoder = decoder 137383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.seennl = 0 137483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.pendingcr = False 137583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 137683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def decode(self, input, final=False): 137783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # decode input (with the eventual \r from a previous pass) 137883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.decoder is None: 137983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh output = input 138083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 138183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh output = self.decoder.decode(input, final=final) 138283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.pendingcr and (output or final): 138383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh output = "\r" + output 138483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.pendingcr = False 138583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 138683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # retain last \r even when not translating data: 138783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # then readline() is sure to get \r\n in one pass 138883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if output.endswith("\r") and not final: 138983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh output = output[:-1] 139083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.pendingcr = True 139183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 139283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Record which newlines are read 139383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh crlf = output.count('\r\n') 139483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh cr = output.count('\r') - crlf 139583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh lf = output.count('\n') - crlf 139683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.seennl |= (lf and self._LF) | (cr and self._CR) \ 139783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh | (crlf and self._CRLF) 139883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 139983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.translate: 140083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if crlf: 140183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh output = output.replace("\r\n", "\n") 140283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if cr: 140383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh output = output.replace("\r", "\n") 140483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 140583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return output 140683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 140783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def getstate(self): 140883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.decoder is None: 140983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf = b"" 141083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flag = 0 141183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 141283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf, flag = self.decoder.getstate() 141383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flag <<= 1 141483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.pendingcr: 141583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flag |= 1 141683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return buf, flag 141783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 141883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def setstate(self, state): 141983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf, flag = state 142083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.pendingcr = bool(flag & 1) 142183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.decoder is not None: 142283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.decoder.setstate((buf, flag >> 1)) 142383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 142483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def reset(self): 142583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.seennl = 0 142683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.pendingcr = False 142783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.decoder is not None: 142883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.decoder.reset() 142983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 143083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _LF = 1 143183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _CR = 2 143283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _CRLF = 4 143383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 143483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 143583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def newlines(self): 143683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return (None, 143783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "\n", 143883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "\r", 143983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ("\r", "\n"), 144083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh "\r\n", 144183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ("\n", "\r\n"), 144283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ("\r", "\r\n"), 144383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ("\r", "\n", "\r\n") 144483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh )[self.seennl] 144583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 144683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 144783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass TextIOWrapper(TextIOBase): 144883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 144983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh r"""Character and line based layer over a BufferedIOBase object, buffer. 145083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 145183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoding gives the name of the encoding that the stream will be 145283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh decoded or encoded with. It defaults to locale.getpreferredencoding. 145383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 145483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh errors determines the strictness of encoding and decoding (see the 145583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh codecs.register) and defaults to "strict". 145683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 145783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh newline can be None, '', '\n', '\r', or '\r\n'. It controls the 145883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh handling of line endings. If it is None, universal newlines is 145983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh enabled. With this enabled, on input, the lines endings '\n', '\r', 146083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh or '\r\n' are translated to '\n' before being returned to the 146183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh caller. Conversely, on output, '\n' is translated to the system 146283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh default line separator, os.linesep. If newline is any other of its 146383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh legal values, that newline becomes the newline when the file is read 146483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh and it is returned untranslated. On output, '\n' is converted to the 146583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh newline. 146683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 146783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh If line_buffering is True, a call to flush is implied when a call to 146883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh write contains a newline character. 146983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 147083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 147183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _CHUNK_SIZE = 2048 147283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 147383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, buffer, encoding=None, errors=None, newline=None, 147483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh line_buffering=False): 147583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if newline is not None and not isinstance(newline, basestring): 147683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("illegal newline type: %r" % (type(newline),)) 147783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if newline not in (None, "", "\n", "\r", "\r\n"): 147883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("illegal newline value: %r" % (newline,)) 147983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if encoding is None: 148083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 148183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh import locale 148283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except ImportError: 148383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Importing locale may fail if Python is being built 148483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoding = "ascii" 148583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 148683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoding = locale.getpreferredencoding() 148783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 148883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(encoding, basestring): 148983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid encoding: %r" % encoding) 149083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 149183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if errors is None: 149283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh errors = "strict" 149383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 149483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(errors, basestring): 149583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid errors: %r" % errors) 149683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 149783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._buffer = buffer 149883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._line_buffering = line_buffering 149983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._encoding = encoding 150083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._errors = errors 150183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._readuniversal = not newline 150283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._readtranslate = newline is None 150383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._readnl = newline 150483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._writetranslate = newline != '' 150583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._writenl = newline or os.linesep 150683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._encoder = None 150783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoder = None 150883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoded_chars = '' # buffer for text returned from decoder 150983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoded_chars_used = 0 # offset into _decoded_chars for read() 151083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = None # info for reconstructing decoder state 151183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._seekable = self._telling = self.buffer.seekable() 151283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 151383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._seekable and self.writable(): 151483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh position = self.buffer.tell() 151583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if position != 0: 151683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 151783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._get_encoder().setstate(0) 151883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except LookupError: 151983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Sometimes the encoder doesn't exist 152083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pass 152183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 152283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # self._snapshot is either None, or a tuple (dec_flags, next_input) 152383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # where dec_flags is the second (integer) item of the decoder state 152483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # and next_input is the chunk of input bytes that comes next after the 152583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # snapshot point. We use this to reconstruct decoder states in tell(). 152683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 152783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Naming convention: 152883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # - "bytes_..." for integer variables that count input bytes 152983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # - "chars_..." for integer variables that count decoded characters 153083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 153183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __repr__(self): 153283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 153383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh name = self.name 153483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except AttributeError: 153583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "<_pyio.TextIOWrapper encoding='{0}'>".format(self.encoding) 153683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 153783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "<_pyio.TextIOWrapper name={0!r} encoding='{1}'>".format( 153883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh name, self.encoding) 153983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 154083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 154183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def encoding(self): 154283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._encoding 154383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 154483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 154583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def errors(self): 154683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._errors 154783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 154883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 154983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def line_buffering(self): 155083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._line_buffering 155183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 155283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 155383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def buffer(self): 155483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._buffer 155583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 155683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seekable(self): 155783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 155883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("I/O operation on closed file.") 155983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._seekable 156083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 156183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readable(self): 156283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.buffer.readable() 156383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 156483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def writable(self): 156583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.buffer.writable() 156683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 156783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def flush(self): 156883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.buffer.flush() 156983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._telling = self._seekable 157083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 157183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def close(self): 157283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.buffer is not None and not self.closed: 157383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 157483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 157583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh finally: 157683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.buffer.close() 157783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 157883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 157983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def closed(self): 158083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.buffer.closed 158183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 158283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 158383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def name(self): 158483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.buffer.name 158583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 158683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def fileno(self): 158783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.buffer.fileno() 158883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 158983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def isatty(self): 159083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.buffer.isatty() 159183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 159283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def write(self, s): 159383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 159483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("write to closed file") 159583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(s, unicode): 159683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("can't write %s to text stream" % 159783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh s.__class__.__name__) 159883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh length = len(s) 159983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh haslf = (self._writetranslate or self._line_buffering) and "\n" in s 160083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if haslf and self._writetranslate and self._writenl != "\n": 160183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh s = s.replace("\n", self._writenl) 160283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoder = self._encoder or self._get_encoder() 160383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX What if we were just reading? 160483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh b = encoder.encode(s) 160583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.buffer.write(b) 160683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._line_buffering and (haslf or "\r" in s): 160783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 160883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = None 160983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._decoder: 161083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoder.reset() 161183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return length 161283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 161383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _get_encoder(self): 161483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh make_encoder = codecs.getincrementalencoder(self._encoding) 161583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._encoder = make_encoder(self._errors) 161683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._encoder 161783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 161883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _get_decoder(self): 161983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh make_decoder = codecs.getincrementaldecoder(self._encoding) 162083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh decoder = make_decoder(self._errors) 162183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._readuniversal: 162283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh decoder = IncrementalNewlineDecoder(decoder, self._readtranslate) 162383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoder = decoder 162483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return decoder 162583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 162683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The following three methods implement an ADT for _decoded_chars. 162783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Text returned from the decoder is buffered here until the client 162883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # requests it by calling our read() or readline() method. 162983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _set_decoded_chars(self, chars): 163083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Set the _decoded_chars buffer.""" 163183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoded_chars = chars 163283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoded_chars_used = 0 163383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 163483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _get_decoded_chars(self, n=None): 163583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Advance into the _decoded_chars buffer.""" 163683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh offset = self._decoded_chars_used 163783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None: 163883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chars = self._decoded_chars[offset:] 163983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 164083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chars = self._decoded_chars[offset:offset + n] 164183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoded_chars_used += len(chars) 164283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return chars 164383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 164483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _rewind_decoded_chars(self, n): 164583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Rewind the _decoded_chars buffer.""" 164683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._decoded_chars_used < n: 164783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise AssertionError("rewind decoded_chars out of bounds") 164883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoded_chars_used -= n 164983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 165083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _read_chunk(self): 165183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 165283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Read and decode the next chunk of data from the BufferedReader. 165383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 165483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 165583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The return value is True unless EOF was reached. The decoded 165683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # string is placed in self._decoded_chars (replacing its previous 165783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # value). The entire input chunk is sent to the decoder, though 165883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # some of it may remain buffered in the decoder, yet to be 165983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # converted. 166083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 166183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._decoder is None: 166283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("no decoder") 166383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 166483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._telling: 166583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # To prepare for tell(), we need to snapshot a point in the 166683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # file where the decoder's input buffer is empty. 166783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 166883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh dec_buffer, dec_flags = self._decoder.getstate() 166983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Given this, we know there was a valid snapshot point 167083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # len(dec_buffer) bytes ago with decoder state (b'', dec_flags). 167183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 167283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Read a chunk, decode it, and put the result in self._decoded_chars. 167383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh input_chunk = self.buffer.read1(self._CHUNK_SIZE) 167483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh eof = not input_chunk 167583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._set_decoded_chars(self._decoder.decode(input_chunk, eof)) 167683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 167783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._telling: 167883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # At the snapshot point, len(dec_buffer) bytes before the read, 167983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # the next input to be decoded is dec_buffer + input_chunk. 168083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = (dec_flags, dec_buffer + input_chunk) 168183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 168283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return not eof 168383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 168483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _pack_cookie(self, position, dec_flags=0, 168583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh bytes_to_feed=0, need_eof=0, chars_to_skip=0): 168683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The meaning of a tell() cookie is: seek to position, set the 168783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # decoder flags to dec_flags, read bytes_to_feed bytes, feed them 168883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # into the decoder with need_eof as the EOF flag, then skip 168983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # chars_to_skip characters of the decoded result. For most simple 169083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # decoders, tell() will often just give a byte offset in the file. 169183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return (position | (dec_flags<<64) | (bytes_to_feed<<128) | 169283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (chars_to_skip<<192) | bool(need_eof)<<256) 169383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 169483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def _unpack_cookie(self, bigint): 169583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh rest, position = divmod(bigint, 1<<64) 169683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh rest, dec_flags = divmod(rest, 1<<64) 169783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh rest, bytes_to_feed = divmod(rest, 1<<64) 169883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh need_eof, chars_to_skip = divmod(rest, 1<<64) 169983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return position, dec_flags, bytes_to_feed, need_eof, chars_to_skip 170083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 170183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def tell(self): 170283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not self._seekable: 170383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("underlying stream is not seekable") 170483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not self._telling: 170583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("telling position disabled by next() call") 170683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 170783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh position = self.buffer.tell() 170883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh decoder = self._decoder 170983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if decoder is None or self._snapshot is None: 171083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._decoded_chars: 171183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # This should never happen. 171283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise AssertionError("pending decoded text") 171383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return position 171483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 171583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Skip backward to the snapshot point (see _read_chunk). 171683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh dec_flags, next_input = self._snapshot 171783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh position -= len(next_input) 171883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 171983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # How many decoded characters have been used up since the snapshot? 172083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chars_to_skip = self._decoded_chars_used 172183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if chars_to_skip == 0: 172283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # We haven't moved from the snapshot point. 172383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._pack_cookie(position, dec_flags) 172483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 172583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Starting from the snapshot position, we will walk the decoder 172683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # forward until it gives us enough decoded characters. 172783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh saved_state = decoder.getstate() 172883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 172983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Note our initial start point. 173083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh decoder.setstate((b'', dec_flags)) 173183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start_pos = position 173283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0 173383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh need_eof = 0 173483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 173583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Feed the decoder one byte at a time. As we go, note the 173683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # nearest "safe start point" before the current location 173783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # (a point where the decoder has nothing buffered, so seek() 173883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # can safely start from there and advance to this location). 173983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh for next_byte in next_input: 174083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh bytes_fed += 1 174183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chars_decoded += len(decoder.decode(next_byte)) 174283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh dec_buffer, dec_flags = decoder.getstate() 174383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not dec_buffer and chars_decoded <= chars_to_skip: 174483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Decoder buffer is empty, so this is a safe start point. 174583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start_pos += bytes_fed 174683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chars_to_skip -= chars_decoded 174783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0 174883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if chars_decoded >= chars_to_skip: 174983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 175083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 175183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # We didn't get enough decoded data; signal EOF to get more. 175283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh chars_decoded += len(decoder.decode(b'', final=True)) 175383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh need_eof = 1 175483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if chars_decoded < chars_to_skip: 175583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("can't reconstruct logical file position") 175683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 175783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The returned cookie corresponds to the last safe start point. 175883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._pack_cookie( 175983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start_pos, start_flags, bytes_fed, need_eof, chars_to_skip) 176083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh finally: 176183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh decoder.setstate(saved_state) 176283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 176383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def truncate(self, pos=None): 176483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 176583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos is None: 176683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = self.tell() 176783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.buffer.truncate(pos) 176883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 176983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def detach(self): 177083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.buffer is None: 177183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("buffer is already detached") 177283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 177383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buffer = self._buffer 177483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._buffer = None 177583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return buffer 177683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 177783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def seek(self, cookie, whence=0): 177883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 177983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("tell on closed file") 178083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not self._seekable: 178183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("underlying stream is not seekable") 178283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if whence == 1: # seek relative to current position 178383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if cookie != 0: 178483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("can't do nonzero cur-relative seeks") 178583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Seeking to the current position should attempt to 178683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # sync the underlying buffer with the current position. 178783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh whence = 0 178883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh cookie = self.tell() 178983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if whence == 2: # seek relative to end of file 179083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if cookie != 0: 179183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("can't do nonzero end-relative seeks") 179283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 179383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh position = self.buffer.seek(0, 2) 179483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._set_decoded_chars('') 179583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = None 179683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._decoder: 179783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoder.reset() 179883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return position 179983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if whence != 0: 180083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("invalid whence (%r, should be 0, 1 or 2)" % 180183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (whence,)) 180283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if cookie < 0: 180383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("negative seek position %r" % (cookie,)) 180483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 180583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 180683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The strategy of seek() is to go back to the safe start point 180783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # and replay the effect of read(chars_to_skip) from there. 180883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start_pos, dec_flags, bytes_to_feed, need_eof, chars_to_skip = \ 180983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unpack_cookie(cookie) 181083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 181183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Seek back to the safe start point. 181283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.buffer.seek(start_pos) 181383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._set_decoded_chars('') 181483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = None 181583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 181683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Restore the decoder to its state from the safe start point. 181783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if cookie == 0 and self._decoder: 181883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoder.reset() 181983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif self._decoder or dec_flags or chars_to_skip: 182083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoder = self._decoder or self._get_decoder() 182183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoder.setstate((b'', dec_flags)) 182283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = (dec_flags, b'') 182383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 182483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if chars_to_skip: 182583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Just like _read_chunk, feed the decoder and save a snapshot. 182683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh input_chunk = self.buffer.read(bytes_to_feed) 182783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._set_decoded_chars( 182883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoder.decode(input_chunk, need_eof)) 182983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = (dec_flags, input_chunk) 183083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 183183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Skip chars_to_skip of the decoded characters. 183283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if len(self._decoded_chars) < chars_to_skip: 183383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise IOError("can't restore logical file position") 183483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._decoded_chars_used = chars_to_skip 183583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 183683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Finally, reset the encoder (merely useful for proper BOM handling) 183783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 183883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoder = self._encoder or self._get_encoder() 183983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except LookupError: 184083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Sometimes the encoder doesn't exist 184183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pass 184283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 184383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if cookie != 0: 184483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoder.setstate(0) 184583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 184683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoder.reset() 184783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return cookie 184883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 184983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def read(self, n=None): 185083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._checkReadable() 185183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n is None: 185283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n = -1 185383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh decoder = self._decoder or self._get_decoder() 185483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 185583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh n.__index__ 185683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except AttributeError: 185783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("an integer is required") 185883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if n < 0: 185983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Read everything. 186083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh result = (self._get_decoded_chars() + 186183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh decoder.decode(self.buffer.read(), final=True)) 186283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._set_decoded_chars('') 186383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = None 186483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return result 186583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 186683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Keep reading chunks until we have n characters to return. 186783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh eof = False 186883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh result = self._get_decoded_chars(n) 186983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while len(result) < n and not eof: 187083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh eof = not self._read_chunk() 187183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh result += self._get_decoded_chars(n - len(result)) 187283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return result 187383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 187483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def next(self): 187583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._telling = False 187683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh line = self.readline() 187783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not line: 187883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = None 187983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._telling = self._seekable 188083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise StopIteration 188183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return line 188283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 188383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def readline(self, limit=None): 188483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self.closed: 188583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("read from closed file") 188683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if limit is None: 188783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh limit = -1 188883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif not isinstance(limit, (int, long)): 188983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError("limit must be an integer") 189083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 189183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Grab all the decoded text (we will rewind any extra bits later). 189283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh line = self._get_decoded_chars() 189383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 189483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start = 0 189583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Make the decoder if it doesn't already exist. 189683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not self._decoder: 189783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._get_decoder() 189883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 189983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = endpos = None 190083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while True: 190183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._readtranslate: 190283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Newlines are already translated, only search for \n 190383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = line.find('\n', start) 190483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos >= 0: 190583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = pos + 1 190683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 190783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 190883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start = len(line) 190983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 191083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif self._readuniversal: 191183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Universal newline search. Find any of \r, \r\n, \n 191283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The decoder ensures that \r\n are not split in two pieces 191383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 191483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # In C we'd look for these in parallel of course. 191583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh nlpos = line.find("\n", start) 191683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh crpos = line.find("\r", start) 191783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if crpos == -1: 191883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if nlpos == -1: 191983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Nothing found 192083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh start = len(line) 192183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 192283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Found \n 192383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = nlpos + 1 192483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 192583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif nlpos == -1: 192683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Found lone \r 192783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = crpos + 1 192883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 192983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif nlpos < crpos: 193083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Found \n 193183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = nlpos + 1 193283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 193383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif nlpos == crpos + 1: 193483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Found \r\n 193583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = crpos + 2 193683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 193783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 193883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Found \r 193983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = crpos + 1 194083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 194183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 194283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # non-universal 194383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pos = line.find(self._readnl) 194483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if pos >= 0: 194583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = pos + len(self._readnl) 194683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 194783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 194883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if limit >= 0 and len(line) >= limit: 194983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = limit # reached length limit 195083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 195183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 195283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # No line ending seen yet - get more data' 195383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh while self._read_chunk(): 195483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._decoded_chars: 195583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh break 195683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if self._decoded_chars: 195783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh line += self._get_decoded_chars() 195883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 195983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # end of file 196083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._set_decoded_chars('') 196183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._snapshot = None 196283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return line 196383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 196483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if limit >= 0 and endpos > limit: 196583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh endpos = limit # don't exceed limit 196683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 196783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Rewind _decoded_chars to just after the line ending we found. 196883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._rewind_decoded_chars(len(line) - endpos) 196983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return line[:endpos] 197083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 197183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 197283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def newlines(self): 197383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._decoder.newlines if self._decoder else None 197483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 197583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 197683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass StringIO(TextIOWrapper): 197783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """Text I/O implementation using an in-memory buffer. 197883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 197983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The initial_value argument sets the value of object. The newline 198083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh argument is like the one of TextIOWrapper's constructor. 198183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 198283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 198383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, initial_value="", newline="\n"): 198483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh super(StringIO, self).__init__(BytesIO(), 198583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh encoding="utf-8", 198683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh errors="strict", 198783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh newline=newline) 198883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Issue #5645: make universal newlines semantics the same as in the 198983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # C version, even under Windows. 199083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if newline is None: 199183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._writetranslate = False 199283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if initial_value: 199383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(initial_value, unicode): 199483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh initial_value = unicode(initial_value) 199583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.write(initial_value) 199683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.seek(0) 199783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 199883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def getvalue(self): 199983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self.flush() 200083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self.buffer.getvalue().decode(self._encoding, self._errors) 200183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 200283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __repr__(self): 200383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # TextIOWrapper tells the encoding in its repr. In StringIO, 200483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # that's a implementation detail. 200583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return object.__repr__(self) 200683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 200783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 200883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def errors(self): 200983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return None 201083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 201183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh @property 201283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def encoding(self): 201383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return None 201483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 201583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def detach(self): 201683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # This doesn't make sense on StringIO. 201783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._unsupported("detach") 2018