Mercurial > cpython-lru_cache-weakref
annotate Lib/_pyio.py @ 80661:94de77bd0b4b 2.7
Issue #16194: document imp.load_dynamic problems
when read several extension modules from the same binary object file.
| author | Andrew Svetlov <andrew.svetlov@gmail.com> |
|---|---|
| date | Thu, 29 Nov 2012 19:51:28 +0200 |
| parents | d0ab34d4c733 |
| children | b6ff6ac1f049 |
| rev | line source |
|---|---|
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2 Python implementation of the io module. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
3 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
4 |
|
61022
17cc2f532563
fold __future__ imports
Benjamin Peterson <benjamin@python.org>
parents:
61021
diff
changeset
|
5 from __future__ import (print_function, unicode_literals) |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
6 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
7 import os |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
8 import abc |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
9 import codecs |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
10 import warnings |
|
73667
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
11 import errno |
| 61021 | 12 # Import thread instead of threading to reduce startup cost |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
13 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
14 from thread import allocate_lock as Lock |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
15 except ImportError: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
16 from dummy_thread import allocate_lock as Lock |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
17 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
18 import io |
| 61023 | 19 from io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END) |
|
68028
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
20 from errno import EINTR |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
21 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
22 __metaclass__ = type |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
23 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
24 # open() uses st_blksize whenever we can |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
25 DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
26 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
27 # NOTE: Base classes defined here are registered with the "official" ABCs |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
28 # defined in io.py. We don't use real inheritance though, because we don't |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
29 # want to inherit the C implementations. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
30 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
31 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
32 class BlockingIOError(IOError): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
33 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
34 """Exception raised when I/O would block on a non-blocking I/O stream.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
35 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
36 def __init__(self, errno, strerror, characters_written=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
37 super(IOError, self).__init__(errno, strerror) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
38 if not isinstance(characters_written, (int, long)): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
39 raise TypeError("characters_written must be a integer") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
40 self.characters_written = characters_written |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
41 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
42 |
|
61019
adc0797ba921
reject None as the buffering argument like the C implementation does #8546
Benjamin Peterson <benjamin@python.org>
parents:
59431
diff
changeset
|
43 def open(file, mode="r", buffering=-1, |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
44 encoding=None, errors=None, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
45 newline=None, closefd=True): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
46 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
47 r"""Open file and return a stream. Raise IOError upon failure. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
48 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
49 file is either a text or byte string giving the name (and the path |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
50 if the file isn't in the current working directory) of the file to |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
51 be opened or an integer file descriptor of the file to be |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
52 wrapped. (If a file descriptor is given, it is closed when the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
53 returned I/O object is closed, unless closefd is set to False.) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
54 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
55 mode is an optional string that specifies the mode in which the file |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
56 is opened. It defaults to 'r' which means open for reading in text |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
57 mode. Other common values are 'w' for writing (truncating the file if |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
58 it already exists), and 'a' for appending (which on some Unix systems, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
59 means that all writes append to the end of the file regardless of the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
60 current seek position). In text mode, if encoding is not specified the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
61 encoding used is platform dependent. (For reading and writing raw |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
62 bytes use binary mode and leave encoding unspecified.) The available |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
63 modes are: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
64 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
65 ========= =============================================================== |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
66 Character Meaning |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
67 --------- --------------------------------------------------------------- |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
68 'r' open for reading (default) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
69 'w' open for writing, truncating the file first |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
70 'a' open for writing, appending to the end of the file if it exists |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
71 'b' binary mode |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
72 't' text mode (default) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
73 '+' open a disk file for updating (reading and writing) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
74 'U' universal newline mode (for backwards compatibility; unneeded |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
75 for new code) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
76 ========= =============================================================== |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
77 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
78 The default mode is 'rt' (open for reading text). For binary random |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
79 access, the mode 'w+b' opens and truncates the file to 0 bytes, while |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
80 'r+b' opens the file without truncation. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
81 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
82 Python distinguishes between files opened in binary and text modes, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
83 even when the underlying operating system doesn't. Files opened in |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
84 binary mode (appending 'b' to the mode argument) return contents as |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
85 bytes objects without any decoding. In text mode (the default, or when |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
86 't' is appended to the mode argument), the contents of the file are |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
87 returned as strings, the bytes having been first decoded using a |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
88 platform-dependent encoding or using the specified encoding if given. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
89 |
|
57787
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
90 buffering is an optional integer used to set the buffering policy. |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
91 Pass 0 to switch buffering off (only allowed in binary mode), 1 to select |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
92 line buffering (only usable in text mode), and an integer > 1 to indicate |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
93 the size of a fixed-size chunk buffer. When no buffering argument is |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
94 given, the default buffering policy works as follows: |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
95 |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
96 * Binary files are buffered in fixed-size chunks; the size of the buffer |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
97 is chosen using a heuristic trying to determine the underlying device's |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
98 "block size" and falling back on `io.DEFAULT_BUFFER_SIZE`. |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
99 On many systems, the buffer will typically be 4096 or 8192 bytes long. |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
100 |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
101 * "Interactive" text files (files for which isatty() returns True) |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
102 use line buffering. Other text files use the policy described above |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
103 for binary files. |
|
101320899041
Issue #7545: improve documentation of the `buffering` argument in io.open().
Antoine Pitrou <solipsis@pitrou.net>
parents:
56703
diff
changeset
|
104 |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
105 encoding is the name of the encoding used to decode or encode the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
106 file. This should only be used in text mode. The default encoding is |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
107 platform dependent, but any encoding supported by Python can be |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
108 passed. See the codecs module for the list of supported encodings. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
109 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
110 errors is an optional string that specifies how encoding errors are to |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
111 be handled---this argument should not be used in binary mode. Pass |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
112 'strict' to raise a ValueError exception if there is an encoding error |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
113 (the default of None has the same effect), or pass 'ignore' to ignore |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
114 errors. (Note that ignoring encoding errors can lead to data loss.) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
115 See the documentation for codecs.register for a list of the permitted |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
116 encoding error strings. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
117 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
118 newline controls how universal newlines works (it only applies to text |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
119 mode). It can be None, '', '\n', '\r', and '\r\n'. It works as |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
120 follows: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
121 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
122 * On input, if newline is None, universal newlines mode is |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
123 enabled. Lines in the input can end in '\n', '\r', or '\r\n', and |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
124 these are translated into '\n' before being returned to the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
125 caller. If it is '', universal newline mode is enabled, but line |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
126 endings are returned to the caller untranslated. If it has any of |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
127 the other legal values, input lines are only terminated by the given |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
128 string, and the line ending is returned to the caller untranslated. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
129 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
130 * On output, if newline is None, any '\n' characters written are |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
131 translated to the system default line separator, os.linesep. If |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
132 newline is '', no translation takes place. If newline is any of the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
133 other legal values, any '\n' characters written are translated to |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
134 the given string. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
135 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
136 If closefd is False, the underlying file descriptor will be kept open |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
137 when the file is closed. This does not work when a file name is given |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
138 and must be True in that case. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
139 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
140 open() returns a file object whose type depends on the mode, and |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
141 through which the standard file operations such as reading and writing |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
142 are performed. When open() is used to open a file in a text mode ('w', |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
143 'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
144 a file in a binary mode, the returned class varies: in read binary |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
145 mode, it returns a BufferedReader; in write binary and append binary |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
146 modes, it returns a BufferedWriter, and in read/write mode, it returns |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
147 a BufferedRandom. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
148 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
149 It is also possible to use a string or bytearray as a file for both |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
150 reading and writing. For strings StringIO can be used like a file |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
151 opened in a text mode, and for bytes a BytesIO can be used like a file |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
152 opened in a binary mode. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
153 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
154 if not isinstance(file, (basestring, int, long)): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
155 raise TypeError("invalid file: %r" % file) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
156 if not isinstance(mode, basestring): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
157 raise TypeError("invalid mode: %r" % mode) |
|
61019
adc0797ba921
reject None as the buffering argument like the C implementation does #8546
Benjamin Peterson <benjamin@python.org>
parents:
59431
diff
changeset
|
158 if not isinstance(buffering, (int, long)): |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
159 raise TypeError("invalid buffering: %r" % buffering) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
160 if encoding is not None and not isinstance(encoding, basestring): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
161 raise TypeError("invalid encoding: %r" % encoding) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
162 if errors is not None and not isinstance(errors, basestring): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
163 raise TypeError("invalid errors: %r" % errors) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
164 modes = set(mode) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
165 if modes - set("arwb+tU") or len(mode) > len(modes): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
166 raise ValueError("invalid mode: %r" % mode) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
167 reading = "r" in modes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
168 writing = "w" in modes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
169 appending = "a" in modes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
170 updating = "+" in modes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
171 text = "t" in modes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
172 binary = "b" in modes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
173 if "U" in modes: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
174 if writing or appending: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
175 raise ValueError("can't use U and writing mode at once") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
176 reading = True |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
177 if text and binary: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
178 raise ValueError("can't have text and binary mode at once") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
179 if reading + writing + appending > 1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
180 raise ValueError("can't have read/write/append mode at once") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
181 if not (reading or writing or appending): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
182 raise ValueError("must have exactly one of read/write/append mode") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
183 if binary and encoding is not None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
184 raise ValueError("binary mode doesn't take an encoding argument") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
185 if binary and errors is not None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
186 raise ValueError("binary mode doesn't take an errors argument") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
187 if binary and newline is not None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
188 raise ValueError("binary mode doesn't take a newline argument") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
189 raw = FileIO(file, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
190 (reading and "r" or "") + |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
191 (writing and "w" or "") + |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
192 (appending and "a" or "") + |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
193 (updating and "+" or ""), |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
194 closefd) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
195 line_buffering = False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
196 if buffering == 1 or buffering < 0 and raw.isatty(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
197 buffering = -1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
198 line_buffering = True |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
199 if buffering < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
200 buffering = DEFAULT_BUFFER_SIZE |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
201 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
202 bs = os.fstat(raw.fileno()).st_blksize |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
203 except (os.error, AttributeError): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
204 pass |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
205 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
206 if bs > 1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
207 buffering = bs |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
208 if buffering < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
209 raise ValueError("invalid buffering size") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
210 if buffering == 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
211 if binary: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
212 return raw |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
213 raise ValueError("can't have unbuffered text I/O") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
214 if updating: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
215 buffer = BufferedRandom(raw, buffering) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
216 elif writing or appending: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
217 buffer = BufferedWriter(raw, buffering) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
218 elif reading: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
219 buffer = BufferedReader(raw, buffering) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
220 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
221 raise ValueError("unknown mode: %r" % mode) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
222 if binary: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
223 return buffer |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
224 text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
225 text.mode = mode |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
226 return text |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
227 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
228 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
229 class DocDescriptor: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
230 """Helper for builtins.open.__doc__ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
231 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
232 def __get__(self, obj, typ): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
233 return ( |
|
61024
ae6f5865b386
correct signature
Benjamin Peterson <benjamin@python.org>
parents:
61023
diff
changeset
|
234 "open(file, mode='r', buffering=-1, encoding=None, " |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
235 "errors=None, newline=None, closefd=True)\n\n" + |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
236 open.__doc__) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
237 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
238 class OpenWrapper: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
239 """Wrapper for builtins.open |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
240 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
241 Trick so that open won't become a bound method when stored |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
242 as a class variable (as dbm.dumb does). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
243 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
244 See initstdio() in Python/pythonrun.c. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
245 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
246 __doc__ = DocDescriptor() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
247 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
248 def __new__(cls, *args, **kwargs): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
249 return open(*args, **kwargs) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
250 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
251 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
252 class UnsupportedOperation(ValueError, IOError): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
253 pass |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
254 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
255 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
256 class IOBase: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
257 __metaclass__ = abc.ABCMeta |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
258 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
259 """The abstract base class for all I/O classes, acting on streams of |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
260 bytes. There is no public constructor. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
261 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
262 This class provides dummy implementations for many methods that |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
263 derived classes can override selectively; the default implementations |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
264 represent a file that cannot be read, written or seeked. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
265 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
266 Even though IOBase does not declare read, readinto, or write because |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
267 their signatures will vary, implementations and clients should |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
268 consider those methods part of the interface. Also, implementations |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
269 may raise a IOError when operations they do not support are called. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
270 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
271 The basic type used for binary data read from or written to a file is |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
272 bytes. bytearrays are accepted too, and in some cases (such as |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
273 readinto) needed. Text I/O classes work with str data. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
274 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
275 Note that calling any method (even inquiries) on a closed stream is |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
276 undefined. Implementations may raise IOError in this case. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
277 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
278 IOBase (and its subclasses) support the iterator protocol, meaning |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
279 that an IOBase object can be iterated over yielding the lines in a |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
280 stream. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
281 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
282 IOBase also supports the :keyword:`with` statement. In this example, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
283 fp is closed after the suite of the with statement is complete: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
284 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
285 with open('spam.txt', 'r') as fp: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
286 fp.write('Spam and eggs!') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
287 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
288 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
289 ### Internal ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
290 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
291 def _unsupported(self, name): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
292 """Internal: raise an exception for unsupported operations.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
293 raise UnsupportedOperation("%s.%s() not supported" % |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
294 (self.__class__.__name__, name)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
295 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
296 ### Positioning ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
297 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
298 def seek(self, pos, whence=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
299 """Change stream position. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
300 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
301 Change the stream position to byte offset offset. offset is |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
302 interpreted relative to the position indicated by whence. Values |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
303 for whence are: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
304 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
305 * 0 -- start of stream (the default); offset should be zero or positive |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
306 * 1 -- current stream position; offset may be negative |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
307 * 2 -- end of stream; offset is usually negative |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
308 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
309 Return the new absolute position. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
310 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
311 self._unsupported("seek") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
312 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
313 def tell(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
314 """Return current stream position.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
315 return self.seek(0, 1) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
316 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
317 def truncate(self, pos=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
318 """Truncate file to size bytes. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
319 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
320 Size defaults to the current IO position as reported by tell(). Return |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
321 the new size. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
322 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
323 self._unsupported("truncate") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
324 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
325 ### Flush and close ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
326 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
327 def flush(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
328 """Flush write buffers, if applicable. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
329 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
330 This is not implemented for read-only and non-blocking streams. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
331 """ |
|
61180
9b438bb06d4d
Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents:
61024
diff
changeset
|
332 self._checkClosed() |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
333 # XXX Should this return the number of bytes written??? |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
334 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
335 __closed = False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
336 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
337 def close(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
338 """Flush and close the IO object. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
339 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
340 This method has no effect if the file is already closed. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
341 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
342 if not self.__closed: |
|
61180
9b438bb06d4d
Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents:
61024
diff
changeset
|
343 self.flush() |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
344 self.__closed = True |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
345 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
346 def __del__(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
347 """Destructor. Calls close().""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
348 # The try/except block is in case this is called at program |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
349 # exit time, when it's possible that globals have already been |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
350 # deleted, and then the close() call might fail. Since |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
351 # there's nothing we can do about such failures and they annoy |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
352 # the end users, we suppress the traceback. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
353 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
354 self.close() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
355 except: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
356 pass |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
357 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
358 ### Inquiries ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
359 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
360 def seekable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
361 """Return whether object supports random access. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
362 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
363 If False, seek(), tell() and truncate() will raise IOError. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
364 This method may need to do a test seek(). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
365 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
366 return False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
367 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
368 def _checkSeekable(self, msg=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
369 """Internal: raise an IOError if file is not seekable |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
370 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
371 if not self.seekable(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
372 raise IOError("File or stream is not seekable." |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
373 if msg is None else msg) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
374 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
375 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
376 def readable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
377 """Return whether object was opened for reading. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
378 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
379 If False, read() will raise IOError. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
380 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
381 return False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
382 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
383 def _checkReadable(self, msg=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
384 """Internal: raise an IOError if file is not readable |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
385 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
386 if not self.readable(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
387 raise IOError("File or stream is not readable." |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
388 if msg is None else msg) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
389 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
390 def writable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
391 """Return whether object was opened for writing. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
392 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
393 If False, write() and truncate() will raise IOError. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
394 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
395 return False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
396 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
397 def _checkWritable(self, msg=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
398 """Internal: raise an IOError if file is not writable |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
399 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
400 if not self.writable(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
401 raise IOError("File or stream is not writable." |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
402 if msg is None else msg) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
403 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
404 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
405 def closed(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
406 """closed: bool. True iff the file has been closed. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
407 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
408 For backwards compatibility, this is a property, not a predicate. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
409 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
410 return self.__closed |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
411 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
412 def _checkClosed(self, msg=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
413 """Internal: raise an ValueError if file is closed |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
414 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
415 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
416 raise ValueError("I/O operation on closed file." |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
417 if msg is None else msg) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
418 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
419 ### Context manager ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
420 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
421 def __enter__(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
422 """Context management protocol. Returns self.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
423 self._checkClosed() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
424 return self |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
425 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
426 def __exit__(self, *args): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
427 """Context management protocol. Calls close()""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
428 self.close() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
429 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
430 ### Lower-level APIs ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
431 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
432 # XXX Should these be present even if unimplemented? |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
433 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
434 def fileno(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
435 """Returns underlying file descriptor if one exists. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
436 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
437 An IOError is raised if the IO object does not use a file descriptor. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
438 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
439 self._unsupported("fileno") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
440 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
441 def isatty(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
442 """Return whether this is an 'interactive' stream. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
443 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
444 Return False if it can't be determined. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
445 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
446 self._checkClosed() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
447 return False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
448 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
449 ### Readline[s] and writelines ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
450 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
451 def readline(self, limit=-1): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
452 r"""Read and return a line from the stream. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
453 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
454 If limit is specified, at most limit bytes will be read. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
455 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
456 The line terminator is always b'\n' for binary files; for text |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
457 files, the newlines argument to open can be used to select the line |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
458 terminator(s) recognized. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
459 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
460 # For backwards compatibility, a (slowish) readline(). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
461 if hasattr(self, "peek"): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
462 def nreadahead(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
463 readahead = self.peek(1) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
464 if not readahead: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
465 return 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
466 n = (readahead.find(b"\n") + 1) or len(readahead) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
467 if limit >= 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
468 n = min(n, limit) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
469 return n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
470 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
471 def nreadahead(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
472 return 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
473 if limit is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
474 limit = -1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
475 elif not isinstance(limit, (int, long)): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
476 raise TypeError("limit must be an integer") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
477 res = bytearray() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
478 while limit < 0 or len(res) < limit: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
479 b = self.read(nreadahead()) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
480 if not b: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
481 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
482 res += b |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
483 if res.endswith(b"\n"): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
484 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
485 return bytes(res) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
486 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
487 def __iter__(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
488 self._checkClosed() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
489 return self |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
490 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
491 def next(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
492 line = self.readline() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
493 if not line: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
494 raise StopIteration |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
495 return line |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
496 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
497 def readlines(self, hint=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
498 """Return a list of lines from the stream. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
499 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
500 hint can be specified to control the number of lines read: no more |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
501 lines will be read if the total size (in bytes/characters) of all |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
502 lines so far exceeds hint. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
503 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
504 if hint is not None and not isinstance(hint, (int, long)): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
505 raise TypeError("integer or None expected") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
506 if hint is None or hint <= 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
507 return list(self) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
508 n = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
509 lines = [] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
510 for line in self: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
511 lines.append(line) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
512 n += len(line) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
513 if n >= hint: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
514 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
515 return lines |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
516 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
517 def writelines(self, lines): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
518 self._checkClosed() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
519 for line in lines: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
520 self.write(line) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
521 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
522 io.IOBase.register(IOBase) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
523 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
524 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
525 class RawIOBase(IOBase): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
526 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
527 """Base class for raw binary I/O.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
528 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
529 # The read() method is implemented by calling readinto(); derived |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
530 # classes that want to support read() only need to implement |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
531 # readinto() as a primitive operation. In general, readinto() can be |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
532 # more efficient than read(). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
533 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
534 # (It would be tempting to also provide an implementation of |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
535 # readinto() in terms of read(), in case the latter is a more suitable |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
536 # primitive operation, but that would lead to nasty recursion in case |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
537 # a subclass doesn't implement either.) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
538 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
539 def read(self, n=-1): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
540 """Read and return up to n bytes. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
541 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
542 Returns an empty bytes object on EOF, or None if the object is |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
543 set not to block and has no data to read. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
544 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
545 if n is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
546 n = -1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
547 if n < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
548 return self.readall() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
549 b = bytearray(n.__index__()) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
550 n = self.readinto(b) |
|
64750
2b9dea2a2fff
Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61210
diff
changeset
|
551 if n is None: |
|
2b9dea2a2fff
Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61210
diff
changeset
|
552 return None |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
553 del b[n:] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
554 return bytes(b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
555 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
556 def readall(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
557 """Read until EOF, using multiple read() call.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
558 res = bytearray() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
559 while True: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
560 data = self.read(DEFAULT_BUFFER_SIZE) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
561 if not data: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
562 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
563 res += data |
|
70388
43a498da8680
Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68028
diff
changeset
|
564 if res: |
|
43a498da8680
Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68028
diff
changeset
|
565 return bytes(res) |
|
43a498da8680
Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68028
diff
changeset
|
566 else: |
|
43a498da8680
Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68028
diff
changeset
|
567 # b'' or None |
|
43a498da8680
Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68028
diff
changeset
|
568 return data |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
569 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
570 def readinto(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
571 """Read up to len(b) bytes into b. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
572 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
573 Returns number of bytes read (0 for EOF), or None if the object |
|
64750
2b9dea2a2fff
Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61210
diff
changeset
|
574 is set not to block and has no data to read. |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
575 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
576 self._unsupported("readinto") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
577 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
578 def write(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
579 """Write the given buffer to the IO stream. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
580 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
581 Returns the number of bytes written, which may be less than len(b). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
582 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
583 self._unsupported("write") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
584 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
585 io.RawIOBase.register(RawIOBase) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
586 from _io import FileIO |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
587 RawIOBase.register(FileIO) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
588 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
589 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
590 class BufferedIOBase(IOBase): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
591 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
592 """Base class for buffered IO objects. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
593 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
594 The main difference with RawIOBase is that the read() method |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
595 supports omitting the size argument, and does not have a default |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
596 implementation that defers to readinto(). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
597 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
598 In addition, read(), readinto() and write() may raise |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
599 BlockingIOError if the underlying raw stream is in non-blocking |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
600 mode and not ready; unlike their raw counterparts, they will never |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
601 return None. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
602 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
603 A typical implementation should not inherit from a RawIOBase |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
604 implementation, but wrap one. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
605 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
606 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
607 def read(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
608 """Read and return up to n bytes. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
609 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
610 If the argument is omitted, None, or negative, reads and |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
611 returns all data until EOF. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
612 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
613 If the argument is positive, and the underlying raw stream is |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
614 not 'interactive', multiple raw reads may be issued to satisfy |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
615 the byte count (unless EOF is reached first). But for |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
616 interactive raw streams (XXX and for pipes?), at most one raw |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
617 read will be issued, and a short result does not imply that |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
618 EOF is imminent. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
619 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
620 Returns an empty bytes array on EOF. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
621 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
622 Raises BlockingIOError if the underlying raw stream has no |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
623 data at the moment. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
624 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
625 self._unsupported("read") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
626 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
627 def read1(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
628 """Read up to n bytes with at most one read() system call.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
629 self._unsupported("read1") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
630 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
631 def readinto(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
632 """Read up to len(b) bytes into b. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
633 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
634 Like read(), this may issue multiple reads to the underlying raw |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
635 stream, unless the latter is 'interactive'. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
636 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
637 Returns the number of bytes read (0 for EOF). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
638 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
639 Raises BlockingIOError if the underlying raw stream has no |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
640 data at the moment. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
641 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
642 # XXX This ought to work with anything that supports the buffer API |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
643 data = self.read(len(b)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
644 n = len(data) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
645 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
646 b[:n] = data |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
647 except TypeError as err: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
648 import array |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
649 if not isinstance(b, array.array): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
650 raise err |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
651 b[:n] = array.array(b'b', data) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
652 return n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
653 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
654 def write(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
655 """Write the given buffer to the IO stream. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
656 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
657 Return the number of bytes written, which is never less than |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
658 len(b). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
659 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
660 Raises BlockingIOError if the buffer is full and the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
661 underlying raw stream cannot accept more data at the moment. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
662 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
663 self._unsupported("write") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
664 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
665 def detach(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
666 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
667 Separate the underlying raw stream from the buffer and return it. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
668 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
669 After the raw stream has been detached, the buffer is in an unusable |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
670 state. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
671 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
672 self._unsupported("detach") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
673 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
674 io.BufferedIOBase.register(BufferedIOBase) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
675 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
676 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
677 class _BufferedIOMixin(BufferedIOBase): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
678 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
679 """A mixin implementation of BufferedIOBase with an underlying raw stream. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
680 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
681 This passes most requests on to the underlying raw stream. It |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
682 does *not* provide implementations of read(), readinto() or |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
683 write(). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
684 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
685 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
686 def __init__(self, raw): |
|
67075
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
687 self._raw = raw |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
688 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
689 ### Positioning ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
690 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
691 def seek(self, pos, whence=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
692 new_position = self.raw.seek(pos, whence) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
693 if new_position < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
694 raise IOError("seek() returned an invalid position") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
695 return new_position |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
696 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
697 def tell(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
698 pos = self.raw.tell() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
699 if pos < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
700 raise IOError("tell() returned an invalid position") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
701 return pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
702 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
703 def truncate(self, pos=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
704 # Flush the stream. We're mixing buffered I/O with lower-level I/O, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
705 # and a flush may be necessary to synch both views of the current |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
706 # file state. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
707 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
708 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
709 if pos is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
710 pos = self.tell() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
711 # XXX: Should seek() be used, instead of passing the position |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
712 # XXX directly to truncate? |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
713 return self.raw.truncate(pos) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
714 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
715 ### Flush and close ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
716 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
717 def flush(self): |
|
61180
9b438bb06d4d
Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents:
61024
diff
changeset
|
718 if self.closed: |
|
9b438bb06d4d
Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents:
61024
diff
changeset
|
719 raise ValueError("flush of closed file") |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
720 self.raw.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
721 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
722 def close(self): |
|
61180
9b438bb06d4d
Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents:
61024
diff
changeset
|
723 if self.raw is not None and not self.closed: |
|
73667
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
724 try: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
725 # may raise BlockingIOError or BrokenPipeError etc |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
726 self.flush() |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
727 finally: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
728 self.raw.close() |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
729 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
730 def detach(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
731 if self.raw is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
732 raise ValueError("raw stream already detached") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
733 self.flush() |
|
67075
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
734 raw = self._raw |
|
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
735 self._raw = None |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
736 return raw |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
737 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
738 ### Inquiries ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
739 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
740 def seekable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
741 return self.raw.seekable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
742 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
743 def readable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
744 return self.raw.readable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
745 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
746 def writable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
747 return self.raw.writable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
748 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
749 @property |
|
67075
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
750 def raw(self): |
|
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
751 return self._raw |
|
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
752 |
|
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
753 @property |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
754 def closed(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
755 return self.raw.closed |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
756 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
757 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
758 def name(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
759 return self.raw.name |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
760 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
761 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
762 def mode(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
763 return self.raw.mode |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
764 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
765 def __repr__(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
766 clsname = self.__class__.__name__ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
767 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
768 name = self.name |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
769 except AttributeError: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
770 return "<_pyio.{0}>".format(clsname) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
771 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
772 return "<_pyio.{0} name={1!r}>".format(clsname, name) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
773 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
774 ### Lower-level APIs ### |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
775 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
776 def fileno(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
777 return self.raw.fileno() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
778 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
779 def isatty(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
780 return self.raw.isatty() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
781 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
782 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
783 class BytesIO(BufferedIOBase): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
784 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
785 """Buffered I/O implementation using an in-memory bytes buffer.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
786 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
787 def __init__(self, initial_bytes=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
788 buf = bytearray() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
789 if initial_bytes is not None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
790 buf.extend(initial_bytes) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
791 self._buffer = buf |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
792 self._pos = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
793 |
|
56703
264609fbda48
Manual py3k backport: [svn r74158] Issue #6218: Make io.BytesIO and io.StringIO picklable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
54717
diff
changeset
|
794 def __getstate__(self): |
|
264609fbda48
Manual py3k backport: [svn r74158] Issue #6218: Make io.BytesIO and io.StringIO picklable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
54717
diff
changeset
|
795 if self.closed: |
|
264609fbda48
Manual py3k backport: [svn r74158] Issue #6218: Make io.BytesIO and io.StringIO picklable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
54717
diff
changeset
|
796 raise ValueError("__getstate__ on closed file") |
|
264609fbda48
Manual py3k backport: [svn r74158] Issue #6218: Make io.BytesIO and io.StringIO picklable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
54717
diff
changeset
|
797 return self.__dict__.copy() |
|
264609fbda48
Manual py3k backport: [svn r74158] Issue #6218: Make io.BytesIO and io.StringIO picklable.
Antoine Pitrou <solipsis@pitrou.net>
parents:
54717
diff
changeset
|
798 |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
799 def getvalue(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
800 """Return the bytes value (contents) of the buffer |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
801 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
802 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
803 raise ValueError("getvalue on closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
804 return bytes(self._buffer) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
805 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
806 def read(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
807 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
808 raise ValueError("read from closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
809 if n is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
810 n = -1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
811 if not isinstance(n, (int, long)): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
812 raise TypeError("integer argument expected, got {0!r}".format( |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
813 type(n))) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
814 if n < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
815 n = len(self._buffer) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
816 if len(self._buffer) <= self._pos: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
817 return b"" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
818 newpos = min(len(self._buffer), self._pos + n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
819 b = self._buffer[self._pos : newpos] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
820 self._pos = newpos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
821 return bytes(b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
822 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
823 def read1(self, n): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
824 """This is the same as read. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
825 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
826 return self.read(n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
827 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
828 def write(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
829 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
830 raise ValueError("write to closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
831 if isinstance(b, unicode): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
832 raise TypeError("can't write unicode to binary stream") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
833 n = len(b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
834 if n == 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
835 return 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
836 pos = self._pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
837 if pos > len(self._buffer): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
838 # Inserts null bytes between the current end of the file |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
839 # and the new write position. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
840 padding = b'\x00' * (pos - len(self._buffer)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
841 self._buffer += padding |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
842 self._buffer[pos:pos + n] = b |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
843 self._pos += n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
844 return n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
845 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
846 def seek(self, pos, whence=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
847 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
848 raise ValueError("seek on closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
849 try: |
|
59431
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
850 pos.__index__ |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
851 except AttributeError: |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
852 raise TypeError("an integer is required") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
853 if whence == 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
854 if pos < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
855 raise ValueError("negative seek position %r" % (pos,)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
856 self._pos = pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
857 elif whence == 1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
858 self._pos = max(0, self._pos + pos) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
859 elif whence == 2: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
860 self._pos = max(0, len(self._buffer) + pos) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
861 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
862 raise ValueError("invalid whence value") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
863 return self._pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
864 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
865 def tell(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
866 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
867 raise ValueError("tell on closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
868 return self._pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
869 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
870 def truncate(self, pos=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
871 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
872 raise ValueError("truncate on closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
873 if pos is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
874 pos = self._pos |
|
59431
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
875 else: |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
876 try: |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
877 pos.__index__ |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
878 except AttributeError: |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
879 raise TypeError("an integer is required") |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
880 if pos < 0: |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
881 raise ValueError("negative truncate position %r" % (pos,)) |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
882 del self._buffer[pos:] |
|
58624
77130f2fe944
- Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents:
57789
diff
changeset
|
883 return pos |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
884 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
885 def readable(self): |
|
78854
d0ab34d4c733
Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
Antoine Pitrou <solipsis@pitrou.net>
parents:
75276
diff
changeset
|
886 if self.closed: |
|
d0ab34d4c733
Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
Antoine Pitrou <solipsis@pitrou.net>
parents:
75276
diff
changeset
|
887 raise ValueError("I/O operation on closed file.") |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
888 return True |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
889 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
890 def writable(self): |
|
78854
d0ab34d4c733
Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
Antoine Pitrou <solipsis@pitrou.net>
parents:
75276
diff
changeset
|
891 if self.closed: |
|
d0ab34d4c733
Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
Antoine Pitrou <solipsis@pitrou.net>
parents:
75276
diff
changeset
|
892 raise ValueError("I/O operation on closed file.") |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
893 return True |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
894 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
895 def seekable(self): |
|
78854
d0ab34d4c733
Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
Antoine Pitrou <solipsis@pitrou.net>
parents:
75276
diff
changeset
|
896 if self.closed: |
|
d0ab34d4c733
Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
Antoine Pitrou <solipsis@pitrou.net>
parents:
75276
diff
changeset
|
897 raise ValueError("I/O operation on closed file.") |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
898 return True |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
899 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
900 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
901 class BufferedReader(_BufferedIOMixin): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
902 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
903 """BufferedReader(raw[, buffer_size]) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
904 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
905 A buffer for a readable, sequential BaseRawIO object. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
906 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
907 The constructor creates a BufferedReader for the given readable raw |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
908 stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
909 is used. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
910 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
911 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
912 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
913 """Create a new buffered reader using the given readable raw IO object. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
914 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
915 if not raw.readable(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
916 raise IOError('"raw" argument must be readable.') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
917 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
918 _BufferedIOMixin.__init__(self, raw) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
919 if buffer_size <= 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
920 raise ValueError("invalid buffer size") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
921 self.buffer_size = buffer_size |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
922 self._reset_read_buf() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
923 self._read_lock = Lock() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
924 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
925 def _reset_read_buf(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
926 self._read_buf = b"" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
927 self._read_pos = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
928 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
929 def read(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
930 """Read n bytes. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
931 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
932 Returns exactly n bytes of data unless the underlying raw IO |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
933 stream reaches EOF or if the call would block in non-blocking |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
934 mode. If n is negative, read until EOF or until read() would |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
935 block. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
936 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
937 if n is not None and n < -1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
938 raise ValueError("invalid number of bytes to read") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
939 with self._read_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
940 return self._read_unlocked(n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
941 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
942 def _read_unlocked(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
943 nodata_val = b"" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
944 empty_values = (b"", None) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
945 buf = self._read_buf |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
946 pos = self._read_pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
947 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
948 # Special case for when the number of bytes to read is unspecified. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
949 if n is None or n == -1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
950 self._reset_read_buf() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
951 chunks = [buf[pos:]] # Strip the consumed bytes. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
952 current_size = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
953 while True: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
954 # Read until EOF or until read() would block. |
|
68028
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
955 try: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
956 chunk = self.raw.read() |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
957 except IOError as e: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
958 if e.errno != EINTR: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
959 raise |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
960 continue |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
961 if chunk in empty_values: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
962 nodata_val = chunk |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
963 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
964 current_size += len(chunk) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
965 chunks.append(chunk) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
966 return b"".join(chunks) or nodata_val |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
967 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
968 # The number of bytes to read is specified, return at most n bytes. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
969 avail = len(buf) - pos # Length of the available buffered data. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
970 if n <= avail: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
971 # Fast path: the data to read is fully buffered. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
972 self._read_pos += n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
973 return buf[pos:pos+n] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
974 # Slow path: read from the stream until enough bytes are read, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
975 # or until an EOF occurs or until read() would block. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
976 chunks = [buf[pos:]] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
977 wanted = max(self.buffer_size, n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
978 while avail < n: |
|
68028
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
979 try: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
980 chunk = self.raw.read(wanted) |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
981 except IOError as e: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
982 if e.errno != EINTR: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
983 raise |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
984 continue |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
985 if chunk in empty_values: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
986 nodata_val = chunk |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
987 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
988 avail += len(chunk) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
989 chunks.append(chunk) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
990 # n is more then avail only when an EOF occurred or when |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
991 # read() would have blocked. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
992 n = min(n, avail) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
993 out = b"".join(chunks) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
994 self._read_buf = out[n:] # Save the extra data in the buffer. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
995 self._read_pos = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
996 return out[:n] if out else nodata_val |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
997 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
998 def peek(self, n=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
999 """Returns buffered bytes without advancing the position. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1000 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1001 The argument indicates a desired minimal number of bytes; we |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1002 do at most one raw read to satisfy it. We never return more |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1003 than self.buffer_size. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1004 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1005 with self._read_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1006 return self._peek_unlocked(n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1007 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1008 def _peek_unlocked(self, n=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1009 want = min(n, self.buffer_size) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1010 have = len(self._read_buf) - self._read_pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1011 if have < want or have <= 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1012 to_read = self.buffer_size - have |
|
68028
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
1013 while True: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
1014 try: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
1015 current = self.raw.read(to_read) |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
1016 except IOError as e: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
1017 if e.errno != EINTR: |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
1018 raise |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
1019 continue |
|
675b48c4c88a
Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
67075
diff
changeset
|
1020 break |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1021 if current: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1022 self._read_buf = self._read_buf[self._read_pos:] + current |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1023 self._read_pos = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1024 return self._read_buf[self._read_pos:] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1025 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1026 def read1(self, n): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1027 """Reads up to n bytes, with at most one read() system call.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1028 # Returns up to n bytes. If at least one byte is buffered, we |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1029 # only return buffered bytes. Otherwise, we do one raw read. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1030 if n < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1031 raise ValueError("number of bytes to read must be positive") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1032 if n == 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1033 return b"" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1034 with self._read_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1035 self._peek_unlocked(1) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1036 return self._read_unlocked( |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1037 min(n, len(self._read_buf) - self._read_pos)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1038 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1039 def tell(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1040 return _BufferedIOMixin.tell(self) - len(self._read_buf) + self._read_pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1041 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1042 def seek(self, pos, whence=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1043 if not (0 <= whence <= 2): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1044 raise ValueError("invalid whence value") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1045 with self._read_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1046 if whence == 1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1047 pos -= len(self._read_buf) - self._read_pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1048 pos = _BufferedIOMixin.seek(self, pos, whence) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1049 self._reset_read_buf() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1050 return pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1051 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1052 class BufferedWriter(_BufferedIOMixin): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1053 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1054 """A buffer for a writeable sequential RawIO object. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1055 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1056 The constructor creates a BufferedWriter for the given writeable raw |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1057 stream. If the buffer_size is not given, it defaults to |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1058 DEFAULT_BUFFER_SIZE. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1059 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1060 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1061 _warning_stack_offset = 2 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1062 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1063 def __init__(self, raw, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1064 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1065 if not raw.writable(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1066 raise IOError('"raw" argument must be writable.') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1067 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1068 _BufferedIOMixin.__init__(self, raw) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1069 if buffer_size <= 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1070 raise ValueError("invalid buffer size") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1071 if max_buffer_size is not None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1072 warnings.warn("max_buffer_size is deprecated", DeprecationWarning, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1073 self._warning_stack_offset) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1074 self.buffer_size = buffer_size |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1075 self._write_buf = bytearray() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1076 self._write_lock = Lock() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1077 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1078 def write(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1079 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1080 raise ValueError("write to closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1081 if isinstance(b, unicode): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1082 raise TypeError("can't write unicode to binary stream") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1083 with self._write_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1084 # XXX we can implement some more tricks to try and avoid |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1085 # partial writes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1086 if len(self._write_buf) > self.buffer_size: |
|
73667
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1087 # We're full, so let's pre-flush the buffer. (This may |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1088 # raise BlockingIOError with characters_written == 0.) |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1089 self._flush_unlocked() |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1090 before = len(self._write_buf) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1091 self._write_buf.extend(b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1092 written = len(self._write_buf) - before |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1093 if len(self._write_buf) > self.buffer_size: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1094 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1095 self._flush_unlocked() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1096 except BlockingIOError as e: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1097 if len(self._write_buf) > self.buffer_size: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1098 # We've hit the buffer_size. We have to accept a partial |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1099 # write and cut back our buffer. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1100 overage = len(self._write_buf) - self.buffer_size |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1101 written -= overage |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1102 self._write_buf = self._write_buf[:self.buffer_size] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1103 raise BlockingIOError(e.errno, e.strerror, written) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1104 return written |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1105 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1106 def truncate(self, pos=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1107 with self._write_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1108 self._flush_unlocked() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1109 if pos is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1110 pos = self.raw.tell() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1111 return self.raw.truncate(pos) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1112 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1113 def flush(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1114 with self._write_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1115 self._flush_unlocked() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1116 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1117 def _flush_unlocked(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1118 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1119 raise ValueError("flush of closed file") |
|
73667
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1120 while self._write_buf: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1121 try: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1122 n = self.raw.write(self._write_buf) |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1123 except BlockingIOError: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1124 raise RuntimeError("self.raw should implement RawIOBase: it " |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1125 "should not raise BlockingIOError") |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1126 except IOError as e: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1127 if e.errno != EINTR: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1128 raise |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1129 continue |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1130 if n is None: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1131 raise BlockingIOError( |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1132 errno.EAGAIN, |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1133 "write could not complete without blocking", 0) |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1134 if n > len(self._write_buf) or n < 0: |
|
e84e17643eeb
Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents:
70388
diff
changeset
|
1135 raise IOError("write() returned incorrect number of bytes") |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1136 del self._write_buf[:n] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1137 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1138 def tell(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1139 return _BufferedIOMixin.tell(self) + len(self._write_buf) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1140 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1141 def seek(self, pos, whence=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1142 if not (0 <= whence <= 2): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1143 raise ValueError("invalid whence") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1144 with self._write_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1145 self._flush_unlocked() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1146 return _BufferedIOMixin.seek(self, pos, whence) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1147 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1148 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1149 class BufferedRWPair(BufferedIOBase): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1150 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1151 """A buffered reader and writer object together. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1152 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1153 A buffered reader object and buffered writer object put together to |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1154 form a sequential IO object that can read and write. This is typically |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1155 used with a socket or two-way pipe. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1156 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1157 reader and writer are RawIOBase objects that are readable and |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1158 writeable respectively. If the buffer_size is omitted it defaults to |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1159 DEFAULT_BUFFER_SIZE. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1160 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1161 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1162 # XXX The usefulness of this (compared to having two separate IO |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1163 # objects) is questionable. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1164 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1165 def __init__(self, reader, writer, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1166 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1167 """Constructor. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1168 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1169 The arguments are two RawIO instances. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1170 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1171 if max_buffer_size is not None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1172 warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1173 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1174 if not reader.readable(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1175 raise IOError('"reader" argument must be readable.') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1176 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1177 if not writer.writable(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1178 raise IOError('"writer" argument must be writable.') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1179 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1180 self.reader = BufferedReader(reader, buffer_size) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1181 self.writer = BufferedWriter(writer, buffer_size) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1182 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1183 def read(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1184 if n is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1185 n = -1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1186 return self.reader.read(n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1187 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1188 def readinto(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1189 return self.reader.readinto(b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1190 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1191 def write(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1192 return self.writer.write(b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1193 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1194 def peek(self, n=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1195 return self.reader.peek(n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1196 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1197 def read1(self, n): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1198 return self.reader.read1(n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1199 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1200 def readable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1201 return self.reader.readable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1202 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1203 def writable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1204 return self.writer.writable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1205 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1206 def flush(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1207 return self.writer.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1208 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1209 def close(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1210 self.writer.close() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1211 self.reader.close() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1212 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1213 def isatty(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1214 return self.reader.isatty() or self.writer.isatty() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1215 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1216 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1217 def closed(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1218 return self.writer.closed |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1219 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1220 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1221 class BufferedRandom(BufferedWriter, BufferedReader): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1222 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1223 """A buffered interface to random access streams. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1224 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1225 The constructor creates a reader and writer for a seekable stream, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1226 raw, given in the first argument. If the buffer_size is omitted it |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1227 defaults to DEFAULT_BUFFER_SIZE. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1228 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1229 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1230 _warning_stack_offset = 3 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1231 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1232 def __init__(self, raw, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1233 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1234 raw._checkSeekable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1235 BufferedReader.__init__(self, raw, buffer_size) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1236 BufferedWriter.__init__(self, raw, buffer_size, max_buffer_size) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1237 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1238 def seek(self, pos, whence=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1239 if not (0 <= whence <= 2): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1240 raise ValueError("invalid whence") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1241 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1242 if self._read_buf: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1243 # Undo read ahead. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1244 with self._read_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1245 self.raw.seek(self._read_pos - len(self._read_buf), 1) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1246 # First do the raw seek, then empty the read buffer, so that |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1247 # if the raw seek fails, we don't lose buffered data forever. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1248 pos = self.raw.seek(pos, whence) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1249 with self._read_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1250 self._reset_read_buf() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1251 if pos < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1252 raise IOError("seek() returned invalid position") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1253 return pos |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1254 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1255 def tell(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1256 if self._write_buf: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1257 return BufferedWriter.tell(self) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1258 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1259 return BufferedReader.tell(self) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1260 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1261 def truncate(self, pos=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1262 if pos is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1263 pos = self.tell() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1264 # Use seek to flush the read buffer. |
|
58624
77130f2fe944
- Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents:
57789
diff
changeset
|
1265 return BufferedWriter.truncate(self, pos) |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1266 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1267 def read(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1268 if n is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1269 n = -1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1270 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1271 return BufferedReader.read(self, n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1272 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1273 def readinto(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1274 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1275 return BufferedReader.readinto(self, b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1276 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1277 def peek(self, n=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1278 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1279 return BufferedReader.peek(self, n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1280 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1281 def read1(self, n): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1282 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1283 return BufferedReader.read1(self, n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1284 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1285 def write(self, b): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1286 if self._read_buf: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1287 # Undo readahead |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1288 with self._read_lock: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1289 self.raw.seek(self._read_pos - len(self._read_buf), 1) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1290 self._reset_read_buf() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1291 return BufferedWriter.write(self, b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1292 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1293 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1294 class TextIOBase(IOBase): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1295 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1296 """Base class for text I/O. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1297 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1298 This class provides a character and line based interface to stream |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1299 I/O. There is no readinto method because Python's character strings |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1300 are immutable. There is no public constructor. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1301 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1302 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1303 def read(self, n=-1): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1304 """Read at most n characters from stream. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1305 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1306 Read from underlying buffer until we have n characters or we hit EOF. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1307 If n is negative or omitted, read until EOF. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1308 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1309 self._unsupported("read") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1310 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1311 def write(self, s): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1312 """Write string s to stream.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1313 self._unsupported("write") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1314 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1315 def truncate(self, pos=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1316 """Truncate size to pos.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1317 self._unsupported("truncate") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1318 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1319 def readline(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1320 """Read until newline or EOF. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1321 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1322 Returns an empty string if EOF is hit immediately. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1323 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1324 self._unsupported("readline") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1325 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1326 def detach(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1327 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1328 Separate the underlying buffer from the TextIOBase and return it. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1329 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1330 After the underlying buffer has been detached, the TextIO is in an |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1331 unusable state. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1332 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1333 self._unsupported("detach") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1334 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1335 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1336 def encoding(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1337 """Subclasses should override.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1338 return None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1339 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1340 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1341 def newlines(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1342 """Line endings translated so far. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1343 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1344 Only line endings translated during reading are considered. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1345 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1346 Subclasses should override. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1347 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1348 return None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1349 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1350 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1351 def errors(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1352 """Error setting of the decoder or encoder. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1353 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1354 Subclasses should override.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1355 return None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1356 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1357 io.TextIOBase.register(TextIOBase) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1358 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1359 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1360 class IncrementalNewlineDecoder(codecs.IncrementalDecoder): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1361 r"""Codec used when reading a file in universal newlines mode. It wraps |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1362 another incremental decoder, translating \r\n and \r into \n. It also |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1363 records the types of newlines encountered. When used with |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1364 translate=False, it ensures that the newline sequence is returned in |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1365 one piece. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1366 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1367 def __init__(self, decoder, translate, errors='strict'): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1368 codecs.IncrementalDecoder.__init__(self, errors=errors) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1369 self.translate = translate |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1370 self.decoder = decoder |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1371 self.seennl = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1372 self.pendingcr = False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1373 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1374 def decode(self, input, final=False): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1375 # decode input (with the eventual \r from a previous pass) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1376 if self.decoder is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1377 output = input |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1378 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1379 output = self.decoder.decode(input, final=final) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1380 if self.pendingcr and (output or final): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1381 output = "\r" + output |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1382 self.pendingcr = False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1383 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1384 # retain last \r even when not translating data: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1385 # then readline() is sure to get \r\n in one pass |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1386 if output.endswith("\r") and not final: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1387 output = output[:-1] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1388 self.pendingcr = True |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1389 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1390 # Record which newlines are read |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1391 crlf = output.count('\r\n') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1392 cr = output.count('\r') - crlf |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1393 lf = output.count('\n') - crlf |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1394 self.seennl |= (lf and self._LF) | (cr and self._CR) \ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1395 | (crlf and self._CRLF) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1396 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1397 if self.translate: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1398 if crlf: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1399 output = output.replace("\r\n", "\n") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1400 if cr: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1401 output = output.replace("\r", "\n") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1402 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1403 return output |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1404 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1405 def getstate(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1406 if self.decoder is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1407 buf = b"" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1408 flag = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1409 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1410 buf, flag = self.decoder.getstate() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1411 flag <<= 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1412 if self.pendingcr: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1413 flag |= 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1414 return buf, flag |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1415 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1416 def setstate(self, state): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1417 buf, flag = state |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1418 self.pendingcr = bool(flag & 1) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1419 if self.decoder is not None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1420 self.decoder.setstate((buf, flag >> 1)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1421 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1422 def reset(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1423 self.seennl = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1424 self.pendingcr = False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1425 if self.decoder is not None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1426 self.decoder.reset() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1427 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1428 _LF = 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1429 _CR = 2 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1430 _CRLF = 4 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1431 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1432 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1433 def newlines(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1434 return (None, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1435 "\n", |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1436 "\r", |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1437 ("\r", "\n"), |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1438 "\r\n", |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1439 ("\n", "\r\n"), |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1440 ("\r", "\r\n"), |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1441 ("\r", "\n", "\r\n") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1442 )[self.seennl] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1443 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1444 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1445 class TextIOWrapper(TextIOBase): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1446 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1447 r"""Character and line based layer over a BufferedIOBase object, buffer. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1448 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1449 encoding gives the name of the encoding that the stream will be |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1450 decoded or encoded with. It defaults to locale.getpreferredencoding. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1451 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1452 errors determines the strictness of encoding and decoding (see the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1453 codecs.register) and defaults to "strict". |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1454 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1455 newline can be None, '', '\n', '\r', or '\r\n'. It controls the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1456 handling of line endings. If it is None, universal newlines is |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1457 enabled. With this enabled, on input, the lines endings '\n', '\r', |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1458 or '\r\n' are translated to '\n' before being returned to the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1459 caller. Conversely, on output, '\n' is translated to the system |
| 75276 | 1460 default line separator, os.linesep. If newline is any other of its |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1461 legal values, that newline becomes the newline when the file is read |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1462 and it is returned untranslated. On output, '\n' is converted to the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1463 newline. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1464 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1465 If line_buffering is True, a call to flush is implied when a call to |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1466 write contains a newline character. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1467 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1468 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1469 _CHUNK_SIZE = 2048 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1470 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1471 def __init__(self, buffer, encoding=None, errors=None, newline=None, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1472 line_buffering=False): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1473 if newline is not None and not isinstance(newline, basestring): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1474 raise TypeError("illegal newline type: %r" % (type(newline),)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1475 if newline not in (None, "", "\n", "\r", "\r\n"): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1476 raise ValueError("illegal newline value: %r" % (newline,)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1477 if encoding is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1478 try: |
|
61210
b760f6ff89ea
_pyio: Fix TextIOWrapper constructor: os has no device_encoding() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61180
diff
changeset
|
1479 import locale |
|
b760f6ff89ea
_pyio: Fix TextIOWrapper constructor: os has no device_encoding() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61180
diff
changeset
|
1480 except ImportError: |
|
b760f6ff89ea
_pyio: Fix TextIOWrapper constructor: os has no device_encoding() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61180
diff
changeset
|
1481 # Importing locale may fail if Python is being built |
|
b760f6ff89ea
_pyio: Fix TextIOWrapper constructor: os has no device_encoding() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61180
diff
changeset
|
1482 encoding = "ascii" |
|
b760f6ff89ea
_pyio: Fix TextIOWrapper constructor: os has no device_encoding() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61180
diff
changeset
|
1483 else: |
|
b760f6ff89ea
_pyio: Fix TextIOWrapper constructor: os has no device_encoding() function
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61180
diff
changeset
|
1484 encoding = locale.getpreferredencoding() |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1485 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1486 if not isinstance(encoding, basestring): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1487 raise ValueError("invalid encoding: %r" % encoding) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1488 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1489 if errors is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1490 errors = "strict" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1491 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1492 if not isinstance(errors, basestring): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1493 raise ValueError("invalid errors: %r" % errors) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1494 |
|
67075
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
1495 self._buffer = buffer |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1496 self._line_buffering = line_buffering |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1497 self._encoding = encoding |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1498 self._errors = errors |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1499 self._readuniversal = not newline |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1500 self._readtranslate = newline is None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1501 self._readnl = newline |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1502 self._writetranslate = newline != '' |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1503 self._writenl = newline or os.linesep |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1504 self._encoder = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1505 self._decoder = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1506 self._decoded_chars = '' # buffer for text returned from decoder |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1507 self._decoded_chars_used = 0 # offset into _decoded_chars for read() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1508 self._snapshot = None # info for reconstructing decoder state |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1509 self._seekable = self._telling = self.buffer.seekable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1510 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1511 if self._seekable and self.writable(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1512 position = self.buffer.tell() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1513 if position != 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1514 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1515 self._get_encoder().setstate(0) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1516 except LookupError: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1517 # Sometimes the encoder doesn't exist |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1518 pass |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1519 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1520 # self._snapshot is either None, or a tuple (dec_flags, next_input) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1521 # where dec_flags is the second (integer) item of the decoder state |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1522 # and next_input is the chunk of input bytes that comes next after the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1523 # snapshot point. We use this to reconstruct decoder states in tell(). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1524 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1525 # Naming convention: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1526 # - "bytes_..." for integer variables that count input bytes |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1527 # - "chars_..." for integer variables that count decoded characters |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1528 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1529 def __repr__(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1530 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1531 name = self.name |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1532 except AttributeError: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1533 return "<_pyio.TextIOWrapper encoding='{0}'>".format(self.encoding) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1534 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1535 return "<_pyio.TextIOWrapper name={0!r} encoding='{1}'>".format( |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1536 name, self.encoding) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1537 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1538 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1539 def encoding(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1540 return self._encoding |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1541 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1542 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1543 def errors(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1544 return self._errors |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1545 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1546 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1547 def line_buffering(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1548 return self._line_buffering |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1549 |
|
67075
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
1550 @property |
|
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
1551 def buffer(self): |
|
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
1552 return self._buffer |
|
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
1553 |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1554 def seekable(self): |
|
78854
d0ab34d4c733
Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
Antoine Pitrou <solipsis@pitrou.net>
parents:
75276
diff
changeset
|
1555 if self.closed: |
|
d0ab34d4c733
Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
Antoine Pitrou <solipsis@pitrou.net>
parents:
75276
diff
changeset
|
1556 raise ValueError("I/O operation on closed file.") |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1557 return self._seekable |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1558 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1559 def readable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1560 return self.buffer.readable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1561 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1562 def writable(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1563 return self.buffer.writable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1564 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1565 def flush(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1566 self.buffer.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1567 self._telling = self._seekable |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1568 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1569 def close(self): |
|
61180
9b438bb06d4d
Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents:
61024
diff
changeset
|
1570 if self.buffer is not None and not self.closed: |
|
9b438bb06d4d
Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents:
61024
diff
changeset
|
1571 self.flush() |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1572 self.buffer.close() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1573 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1574 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1575 def closed(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1576 return self.buffer.closed |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1577 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1578 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1579 def name(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1580 return self.buffer.name |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1581 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1582 def fileno(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1583 return self.buffer.fileno() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1584 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1585 def isatty(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1586 return self.buffer.isatty() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1587 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1588 def write(self, s): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1589 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1590 raise ValueError("write to closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1591 if not isinstance(s, unicode): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1592 raise TypeError("can't write %s to text stream" % |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1593 s.__class__.__name__) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1594 length = len(s) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1595 haslf = (self._writetranslate or self._line_buffering) and "\n" in s |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1596 if haslf and self._writetranslate and self._writenl != "\n": |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1597 s = s.replace("\n", self._writenl) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1598 encoder = self._encoder or self._get_encoder() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1599 # XXX What if we were just reading? |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1600 b = encoder.encode(s) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1601 self.buffer.write(b) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1602 if self._line_buffering and (haslf or "\r" in s): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1603 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1604 self._snapshot = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1605 if self._decoder: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1606 self._decoder.reset() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1607 return length |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1608 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1609 def _get_encoder(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1610 make_encoder = codecs.getincrementalencoder(self._encoding) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1611 self._encoder = make_encoder(self._errors) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1612 return self._encoder |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1613 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1614 def _get_decoder(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1615 make_decoder = codecs.getincrementaldecoder(self._encoding) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1616 decoder = make_decoder(self._errors) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1617 if self._readuniversal: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1618 decoder = IncrementalNewlineDecoder(decoder, self._readtranslate) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1619 self._decoder = decoder |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1620 return decoder |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1621 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1622 # The following three methods implement an ADT for _decoded_chars. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1623 # Text returned from the decoder is buffered here until the client |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1624 # requests it by calling our read() or readline() method. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1625 def _set_decoded_chars(self, chars): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1626 """Set the _decoded_chars buffer.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1627 self._decoded_chars = chars |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1628 self._decoded_chars_used = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1629 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1630 def _get_decoded_chars(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1631 """Advance into the _decoded_chars buffer.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1632 offset = self._decoded_chars_used |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1633 if n is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1634 chars = self._decoded_chars[offset:] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1635 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1636 chars = self._decoded_chars[offset:offset + n] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1637 self._decoded_chars_used += len(chars) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1638 return chars |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1639 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1640 def _rewind_decoded_chars(self, n): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1641 """Rewind the _decoded_chars buffer.""" |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1642 if self._decoded_chars_used < n: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1643 raise AssertionError("rewind decoded_chars out of bounds") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1644 self._decoded_chars_used -= n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1645 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1646 def _read_chunk(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1647 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1648 Read and decode the next chunk of data from the BufferedReader. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1649 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1650 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1651 # The return value is True unless EOF was reached. The decoded |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1652 # string is placed in self._decoded_chars (replacing its previous |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1653 # value). The entire input chunk is sent to the decoder, though |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1654 # some of it may remain buffered in the decoder, yet to be |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1655 # converted. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1656 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1657 if self._decoder is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1658 raise ValueError("no decoder") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1659 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1660 if self._telling: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1661 # To prepare for tell(), we need to snapshot a point in the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1662 # file where the decoder's input buffer is empty. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1663 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1664 dec_buffer, dec_flags = self._decoder.getstate() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1665 # Given this, we know there was a valid snapshot point |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1666 # len(dec_buffer) bytes ago with decoder state (b'', dec_flags). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1667 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1668 # Read a chunk, decode it, and put the result in self._decoded_chars. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1669 input_chunk = self.buffer.read1(self._CHUNK_SIZE) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1670 eof = not input_chunk |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1671 self._set_decoded_chars(self._decoder.decode(input_chunk, eof)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1672 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1673 if self._telling: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1674 # At the snapshot point, len(dec_buffer) bytes before the read, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1675 # the next input to be decoded is dec_buffer + input_chunk. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1676 self._snapshot = (dec_flags, dec_buffer + input_chunk) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1677 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1678 return not eof |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1679 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1680 def _pack_cookie(self, position, dec_flags=0, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1681 bytes_to_feed=0, need_eof=0, chars_to_skip=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1682 # The meaning of a tell() cookie is: seek to position, set the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1683 # decoder flags to dec_flags, read bytes_to_feed bytes, feed them |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1684 # into the decoder with need_eof as the EOF flag, then skip |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1685 # chars_to_skip characters of the decoded result. For most simple |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1686 # decoders, tell() will often just give a byte offset in the file. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1687 return (position | (dec_flags<<64) | (bytes_to_feed<<128) | |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1688 (chars_to_skip<<192) | bool(need_eof)<<256) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1689 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1690 def _unpack_cookie(self, bigint): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1691 rest, position = divmod(bigint, 1<<64) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1692 rest, dec_flags = divmod(rest, 1<<64) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1693 rest, bytes_to_feed = divmod(rest, 1<<64) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1694 need_eof, chars_to_skip = divmod(rest, 1<<64) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1695 return position, dec_flags, bytes_to_feed, need_eof, chars_to_skip |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1696 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1697 def tell(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1698 if not self._seekable: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1699 raise IOError("underlying stream is not seekable") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1700 if not self._telling: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1701 raise IOError("telling position disabled by next() call") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1702 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1703 position = self.buffer.tell() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1704 decoder = self._decoder |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1705 if decoder is None or self._snapshot is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1706 if self._decoded_chars: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1707 # This should never happen. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1708 raise AssertionError("pending decoded text") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1709 return position |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1710 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1711 # Skip backward to the snapshot point (see _read_chunk). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1712 dec_flags, next_input = self._snapshot |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1713 position -= len(next_input) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1714 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1715 # How many decoded characters have been used up since the snapshot? |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1716 chars_to_skip = self._decoded_chars_used |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1717 if chars_to_skip == 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1718 # We haven't moved from the snapshot point. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1719 return self._pack_cookie(position, dec_flags) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1720 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1721 # Starting from the snapshot position, we will walk the decoder |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1722 # forward until it gives us enough decoded characters. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1723 saved_state = decoder.getstate() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1724 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1725 # Note our initial start point. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1726 decoder.setstate((b'', dec_flags)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1727 start_pos = position |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1728 start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1729 need_eof = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1730 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1731 # Feed the decoder one byte at a time. As we go, note the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1732 # nearest "safe start point" before the current location |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1733 # (a point where the decoder has nothing buffered, so seek() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1734 # can safely start from there and advance to this location). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1735 for next_byte in next_input: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1736 bytes_fed += 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1737 chars_decoded += len(decoder.decode(next_byte)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1738 dec_buffer, dec_flags = decoder.getstate() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1739 if not dec_buffer and chars_decoded <= chars_to_skip: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1740 # Decoder buffer is empty, so this is a safe start point. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1741 start_pos += bytes_fed |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1742 chars_to_skip -= chars_decoded |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1743 start_flags, bytes_fed, chars_decoded = dec_flags, 0, 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1744 if chars_decoded >= chars_to_skip: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1745 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1746 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1747 # We didn't get enough decoded data; signal EOF to get more. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1748 chars_decoded += len(decoder.decode(b'', final=True)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1749 need_eof = 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1750 if chars_decoded < chars_to_skip: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1751 raise IOError("can't reconstruct logical file position") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1752 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1753 # The returned cookie corresponds to the last safe start point. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1754 return self._pack_cookie( |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1755 start_pos, start_flags, bytes_fed, need_eof, chars_to_skip) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1756 finally: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1757 decoder.setstate(saved_state) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1758 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1759 def truncate(self, pos=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1760 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1761 if pos is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1762 pos = self.tell() |
|
58624
77130f2fe944
- Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents:
57789
diff
changeset
|
1763 return self.buffer.truncate(pos) |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1764 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1765 def detach(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1766 if self.buffer is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1767 raise ValueError("buffer is already detached") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1768 self.flush() |
|
67075
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
1769 buffer = self._buffer |
|
595f258806ef
Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
64750
diff
changeset
|
1770 self._buffer = None |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1771 return buffer |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1772 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1773 def seek(self, cookie, whence=0): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1774 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1775 raise ValueError("tell on closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1776 if not self._seekable: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1777 raise IOError("underlying stream is not seekable") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1778 if whence == 1: # seek relative to current position |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1779 if cookie != 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1780 raise IOError("can't do nonzero cur-relative seeks") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1781 # Seeking to the current position should attempt to |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1782 # sync the underlying buffer with the current position. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1783 whence = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1784 cookie = self.tell() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1785 if whence == 2: # seek relative to end of file |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1786 if cookie != 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1787 raise IOError("can't do nonzero end-relative seeks") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1788 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1789 position = self.buffer.seek(0, 2) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1790 self._set_decoded_chars('') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1791 self._snapshot = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1792 if self._decoder: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1793 self._decoder.reset() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1794 return position |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1795 if whence != 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1796 raise ValueError("invalid whence (%r, should be 0, 1 or 2)" % |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1797 (whence,)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1798 if cookie < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1799 raise ValueError("negative seek position %r" % (cookie,)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1800 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1801 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1802 # The strategy of seek() is to go back to the safe start point |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1803 # and replay the effect of read(chars_to_skip) from there. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1804 start_pos, dec_flags, bytes_to_feed, need_eof, chars_to_skip = \ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1805 self._unpack_cookie(cookie) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1806 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1807 # Seek back to the safe start point. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1808 self.buffer.seek(start_pos) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1809 self._set_decoded_chars('') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1810 self._snapshot = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1811 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1812 # Restore the decoder to its state from the safe start point. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1813 if cookie == 0 and self._decoder: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1814 self._decoder.reset() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1815 elif self._decoder or dec_flags or chars_to_skip: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1816 self._decoder = self._decoder or self._get_decoder() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1817 self._decoder.setstate((b'', dec_flags)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1818 self._snapshot = (dec_flags, b'') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1819 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1820 if chars_to_skip: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1821 # Just like _read_chunk, feed the decoder and save a snapshot. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1822 input_chunk = self.buffer.read(bytes_to_feed) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1823 self._set_decoded_chars( |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1824 self._decoder.decode(input_chunk, need_eof)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1825 self._snapshot = (dec_flags, input_chunk) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1826 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1827 # Skip chars_to_skip of the decoded characters. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1828 if len(self._decoded_chars) < chars_to_skip: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1829 raise IOError("can't restore logical file position") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1830 self._decoded_chars_used = chars_to_skip |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1831 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1832 # Finally, reset the encoder (merely useful for proper BOM handling) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1833 try: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1834 encoder = self._encoder or self._get_encoder() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1835 except LookupError: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1836 # Sometimes the encoder doesn't exist |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1837 pass |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1838 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1839 if cookie != 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1840 encoder.setstate(0) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1841 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1842 encoder.reset() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1843 return cookie |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1844 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1845 def read(self, n=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1846 self._checkReadable() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1847 if n is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1848 n = -1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1849 decoder = self._decoder or self._get_decoder() |
|
59431
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
1850 try: |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
1851 n.__index__ |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
1852 except AttributeError: |
|
e2d41079d059
Fix some py3k warnings in the standard library.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
58624
diff
changeset
|
1853 raise TypeError("an integer is required") |
|
54717
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1854 if n < 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1855 # Read everything. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1856 result = (self._get_decoded_chars() + |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1857 decoder.decode(self.buffer.read(), final=True)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1858 self._set_decoded_chars('') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1859 self._snapshot = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1860 return result |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1861 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1862 # Keep reading chunks until we have n characters to return. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1863 eof = False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1864 result = self._get_decoded_chars(n) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1865 while len(result) < n and not eof: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1866 eof = not self._read_chunk() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1867 result += self._get_decoded_chars(n - len(result)) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1868 return result |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1869 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1870 def next(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1871 self._telling = False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1872 line = self.readline() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1873 if not line: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1874 self._snapshot = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1875 self._telling = self._seekable |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1876 raise StopIteration |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1877 return line |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1878 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1879 def readline(self, limit=None): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1880 if self.closed: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1881 raise ValueError("read from closed file") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1882 if limit is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1883 limit = -1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1884 elif not isinstance(limit, (int, long)): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1885 raise TypeError("limit must be an integer") |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1886 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1887 # Grab all the decoded text (we will rewind any extra bits later). |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1888 line = self._get_decoded_chars() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1889 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1890 start = 0 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1891 # Make the decoder if it doesn't already exist. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1892 if not self._decoder: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1893 self._get_decoder() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1894 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1895 pos = endpos = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1896 while True: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1897 if self._readtranslate: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1898 # Newlines are already translated, only search for \n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1899 pos = line.find('\n', start) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1900 if pos >= 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1901 endpos = pos + 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1902 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1903 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1904 start = len(line) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1905 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1906 elif self._readuniversal: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1907 # Universal newline search. Find any of \r, \r\n, \n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1908 # The decoder ensures that \r\n are not split in two pieces |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1909 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1910 # In C we'd look for these in parallel of course. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1911 nlpos = line.find("\n", start) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1912 crpos = line.find("\r", start) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1913 if crpos == -1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1914 if nlpos == -1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1915 # Nothing found |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1916 start = len(line) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1917 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1918 # Found \n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1919 endpos = nlpos + 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1920 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1921 elif nlpos == -1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1922 # Found lone \r |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1923 endpos = crpos + 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1924 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1925 elif nlpos < crpos: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1926 # Found \n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1927 endpos = nlpos + 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1928 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1929 elif nlpos == crpos + 1: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1930 # Found \r\n |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1931 endpos = crpos + 2 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1932 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1933 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1934 # Found \r |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1935 endpos = crpos + 1 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1936 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1937 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1938 # non-universal |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1939 pos = line.find(self._readnl) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1940 if pos >= 0: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1941 endpos = pos + len(self._readnl) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1942 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1943 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1944 if limit >= 0 and len(line) >= limit: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1945 endpos = limit # reached length limit |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1946 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1947 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1948 # No line ending seen yet - get more data' |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1949 while self._read_chunk(): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1950 if self._decoded_chars: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1951 break |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1952 if self._decoded_chars: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1953 line += self._get_decoded_chars() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1954 else: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1955 # end of file |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1956 self._set_decoded_chars('') |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1957 self._snapshot = None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1958 return line |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1959 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1960 if limit >= 0 and endpos > limit: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1961 endpos = limit # don't exceed limit |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1962 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1963 # Rewind _decoded_chars to just after the line ending we found. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1964 self._rewind_decoded_chars(len(line) - endpos) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1965 return line[:endpos] |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1966 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1967 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1968 def newlines(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1969 return self._decoder.newlines if self._decoder else None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1970 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1971 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1972 class StringIO(TextIOWrapper): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1973 """Text I/O implementation using an in-memory buffer. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1974 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1975 The initial_value argument sets the value of object. The newline |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1976 argument is like the one of TextIOWrapper's constructor. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1977 """ |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1978 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1979 def __init__(self, initial_value="", newline="\n"): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1980 super(StringIO, self).__init__(BytesIO(), |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1981 encoding="utf-8", |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1982 errors="strict", |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1983 newline=newline) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1984 # Issue #5645: make universal newlines semantics the same as in the |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1985 # C version, even under Windows. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1986 if newline is None: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1987 self._writetranslate = False |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1988 if initial_value: |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1989 if not isinstance(initial_value, unicode): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1990 initial_value = unicode(initial_value) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1991 self.write(initial_value) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1992 self.seek(0) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1993 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1994 def getvalue(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1995 self.flush() |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1996 return self.buffer.getvalue().decode(self._encoding, self._errors) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1997 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1998 def __repr__(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
1999 # TextIOWrapper tells the encoding in its repr. In StringIO, |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2000 # that's a implementation detail. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2001 return object.__repr__(self) |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2002 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2003 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2004 def errors(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2005 return None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2006 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2007 @property |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2008 def encoding(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2009 return None |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2010 |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2011 def detach(self): |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2012 # This doesn't make sense on StringIO. |
|
760a710eb6c1
Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents:
diff
changeset
|
2013 self._unsupported("detach") |
