1:mod:`fileinput` --- Iterate over lines from multiple input streams
2===================================================================
3
4.. module:: fileinput
5   :synopsis: Loop over standard input or a list of files.
6
7.. moduleauthor:: Guido van Rossum <[email protected]>
8.. sectionauthor:: Fred L. Drake, Jr. <[email protected]>
9
10**Source code:** :source:`Lib/fileinput.py`
11
12--------------
13
14This module implements a helper class and functions to quickly write a
15loop over standard input or a list of files. If you just want to read or
16write one file see :func:`open`.
17
18The typical use is::
19
20   import fileinput
21   for line in fileinput.input(encoding="utf-8"):
22       process(line)
23
24This iterates over the lines of all files listed in ``sys.argv[1:]``, defaulting
25to ``sys.stdin`` if the list is empty.  If a filename is ``'-'``, it is also
26replaced by ``sys.stdin`` and the optional arguments *mode* and *openhook*
27are ignored.  To specify an alternative list of filenames, pass it as the
28first argument to :func:`.input`.  A single file name is also allowed.
29
30All files are opened in text mode by default, but you can override this by
31specifying the *mode* parameter in the call to :func:`.input` or
32:class:`FileInput`.  If an I/O error occurs during opening or reading a file,
33:exc:`OSError` is raised.
34
35.. versionchanged:: 3.3
36   :exc:`IOError` used to be raised; it is now an alias of :exc:`OSError`.
37
38If ``sys.stdin`` is used more than once, the second and further use will return
39no lines, except perhaps for interactive use, or if it has been explicitly reset
40(e.g. using ``sys.stdin.seek(0)``).
41
42Empty files are opened and immediately closed; the only time their presence in
43the list of filenames is noticeable at all is when the last file opened is
44empty.
45
46Lines are returned with any newlines intact, which means that the last line in
47a file may not have one.
48
49You can control how files are opened by providing an opening hook via the
50*openhook* parameter to :func:`fileinput.input` or :class:`FileInput()`. The
51hook must be a function that takes two arguments, *filename* and *mode*, and
52returns an accordingly opened file-like object. If *encoding* and/or *errors*
53are specified, they will be passed to the hook as additional keyword arguments.
54This module provides a :func:`hook_compressed` to support compressed files.
55
56The following function is the primary interface of this module:
57
58
59.. function:: input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)
60
61   Create an instance of the :class:`FileInput` class.  The instance will be used
62   as global state for the functions of this module, and is also returned to use
63   during iteration.  The parameters to this function will be passed along to the
64   constructor of the :class:`FileInput` class.
65
66   The :class:`FileInput` instance can be used as a context manager in the
67   :keyword:`with` statement.  In this example, *input* is closed after the
68   :keyword:`!with` statement is exited, even if an exception occurs::
69
70      with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f:
71          for line in f:
72              process(line)
73
74   .. versionchanged:: 3.2
75      Can be used as a context manager.
76
77   .. versionchanged:: 3.8
78      The keyword parameters *mode* and *openhook* are now keyword-only.
79
80   .. versionchanged:: 3.10
81      The keyword-only parameter *encoding* and *errors* are added.
82
83
84The following functions use the global state created by :func:`fileinput.input`;
85if there is no active state, :exc:`RuntimeError` is raised.
86
87
88.. function:: filename()
89
90   Return the name of the file currently being read.  Before the first line has
91   been read, returns ``None``.
92
93
94.. function:: fileno()
95
96   Return the integer "file descriptor" for the current file. When no file is
97   opened (before the first line and between files), returns ``-1``.
98
99
100.. function:: lineno()
101
102   Return the cumulative line number of the line that has just been read.  Before
103   the first line has been read, returns ``0``.  After the last line of the last
104   file has been read, returns the line number of that line.
105
106
107.. function:: filelineno()
108
109   Return the line number in the current file.  Before the first line has been
110   read, returns ``0``.  After the last line of the last file has been read,
111   returns the line number of that line within the file.
112
113
114.. function:: isfirstline()
115
116   Return ``True`` if the line just read is the first line of its file, otherwise
117   return ``False``.
118
119
120.. function:: isstdin()
121
122   Return ``True`` if the last line was read from ``sys.stdin``, otherwise return
123   ``False``.
124
125
126.. function:: nextfile()
127
128   Close the current file so that the next iteration will read the first line from
129   the next file (if any); lines not read from the file will not count towards the
130   cumulative line count.  The filename is not changed until after the first line
131   of the next file has been read.  Before the first line has been read, this
132   function has no effect; it cannot be used to skip the first file.  After the
133   last line of the last file has been read, this function has no effect.
134
135
136.. function:: close()
137
138   Close the sequence.
139
140The class which implements the sequence behavior provided by the module is
141available for subclassing as well:
142
143
144.. class:: FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None)
145
146   Class :class:`FileInput` is the implementation; its methods :meth:`filename`,
147   :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`,
148   :meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the
149   functions of the same name in the module. In addition it is :term:`iterable`
150   and has a :meth:`~io.TextIOBase.readline` method which returns the next
151   input line. The sequence must be accessed in strictly sequential order;
152   random access and :meth:`~io.TextIOBase.readline` cannot be mixed.
153
154   With *mode* you can specify which file mode will be passed to :func:`open`. It
155   must be one of ``'r'`` and ``'rb'``.
156
157   The *openhook*, when given, must be a function that takes two arguments,
158   *filename* and *mode*, and returns an accordingly opened file-like object. You
159   cannot use *inplace* and *openhook* together.
160
161   You can specify *encoding* and *errors* that is passed to :func:`open` or *openhook*.
162
163   A :class:`FileInput` instance can be used as a context manager in the
164   :keyword:`with` statement.  In this example, *input* is closed after the
165   :keyword:`!with` statement is exited, even if an exception occurs::
166
167      with FileInput(files=('spam.txt', 'eggs.txt')) as input:
168          process(input)
169
170   .. versionchanged:: 3.2
171      Can be used as a context manager.
172
173   .. versionchanged:: 3.8
174      The keyword parameter *mode* and *openhook* are now keyword-only.
175
176   .. versionchanged:: 3.10
177      The keyword-only parameter *encoding* and *errors* are added.
178
179   .. versionchanged:: 3.11
180      The ``'rU'`` and ``'U'`` modes and the :meth:`__getitem__` method have
181      been removed.
182
183
184**Optional in-place filtering:** if the keyword argument ``inplace=True`` is
185passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the
186file is moved to a backup file and standard output is directed to the input file
187(if a file of the same name as the backup file already exists, it will be
188replaced silently).  This makes it possible to write a filter that rewrites its
189input file in place.  If the *backup* parameter is given (typically as
190``backup='.<some extension>'``), it specifies the extension for the backup file,
191and the backup file remains around; by default, the extension is ``'.bak'`` and
192it is deleted when the output file is closed.  In-place filtering is disabled
193when standard input is read.
194
195
196The two following opening hooks are provided by this module:
197
198.. function:: hook_compressed(filename, mode, *, encoding=None, errors=None)
199
200   Transparently opens files compressed with gzip and bzip2 (recognized by the
201   extensions ``'.gz'`` and ``'.bz2'``) using the :mod:`gzip` and :mod:`bz2`
202   modules.  If the filename extension is not ``'.gz'`` or ``'.bz2'``, the file is
203   opened normally (ie, using :func:`open` without any decompression).
204
205   The *encoding* and *errors* values are passed to :class:`io.TextIOWrapper`
206   for compressed files and open for normal files.
207
208   Usage example:  ``fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")``
209
210   .. versionchanged:: 3.10
211      The keyword-only parameter *encoding* and *errors* are added.
212
213
214.. function:: hook_encoded(encoding, errors=None)
215
216   Returns a hook which opens each file with :func:`open`, using the given
217   *encoding* and *errors* to read the file.
218
219   Usage example: ``fi =
220   fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8",
221   "surrogateescape"))``
222
223   .. versionchanged:: 3.6
224      Added the optional *errors* parameter.
225
226   .. deprecated:: 3.10
227      This function is deprecated since :func:`fileinput.input` and :class:`FileInput`
228      now have *encoding* and *errors* parameters.
229