1
"""Helper class to quickly write a loop over all standard input files.
6
for line in fileinput.input():
9
This iterates over the lines of all files listed in sys.argv[1:],
10
defaulting to sys.stdin if the list is empty. If a filename is '-' it
11
is also replaced by sys.stdin. To specify an alternative list of
12
filenames, pass it as the argument to input(). A single file name is
15
Functions filename(), lineno() return the filename and cumulative line
16
number of the line that has just been read; filelineno() returns its
17
line number in the current file; isfirstline() returns true iff the
18
line just read is the first line of its file; isstdin() returns true
19
iff the line was read from sys.stdin. Function nextfile() closes the
20
current file so that the next iteration will read the first line from
21
the next file (if any); lines not read from the file will not count
22
towards the cumulative line count; the filename is not changed until
23
after the first line of the next file has been read. Function close()
26
Before any lines have been read, filename() returns None and both line
27
numbers are zero; nextfile() has no effect. After all lines have been
28
read, filename() and the line number functions return the values
29
pertaining to the last line read; nextfile() has no effect.
31
All files are opened in text mode. If an I/O error occurs during
32
opening or reading a file, the IOError exception is raised.
34
If sys.stdin is used more than once, the second and further use will
35
return no lines, except perhaps for interactive use, or if it has been
36
explicitly reset (e.g. using sys.stdin.seek(0)).
38
Empty files are opened and immediately closed; the only time their
39
presence in the list of filenames is noticeable at all is when the
40
last file opened is empty.
42
It is possible that the last line of a file doesn't end in a newline
43
character; otherwise lines are returned including the trailing
46
Class FileInput is the implementation; its methods filename(),
47
lineno(), fileline(), isfirstline(), isstdin(), nextfile() and close()
48
correspond to the functions in the module. In addition it has a
49
readline() method which returns the next input line, and a
50
__getitem__() method which implements the sequence behavior. The
51
sequence must be accessed in strictly sequential order; sequence
52
access and readline() cannot be mixed.
54
Optional in-place filtering: if the keyword argument inplace=1 is
55
passed to input() or to the FileInput constructor, the file is moved
56
to a backup file and standard output is directed to the input file.
57
This makes it possible to write a filter that rewrites its input file
58
in place. If the keyword argument backup=".<some extension>" is also
59
given, it specifies the extension for the backup file, and the backup
60
file remains around; by default, the extension is ".bak" and it is
61
deleted when the output file is closed. In-place filtering is
62
disabled when standard input is read. XXX The current implementation
63
does not work for MS-DOS 8+3 filesystems.
65
Performance: this module is unfortunately one of the slower ways of
66
processing large numbers of input lines. Nevertheless, a significant
67
speed-up has been obtained by using readlines(bufsize) instead of
68
readline(). A new keyword argument, bufsize=N, is present on the
69
input() function and the FileInput() class to override the default
72
XXX Possible additions:
74
- optional getopt argument processing
75
- specify open mode ('r' or 'rb')
78
- read(), read(size), even readlines()
84
__all__ = ["input","close","nextfile","filename","lineno","filelineno",
85
"isfirstline","isstdin","FileInput"]
89
DEFAULT_BUFSIZE = 8*1024
91
def input(files=None, inplace=0, backup="", bufsize=0):
92
"""input([files[, inplace[, backup]]])
94
Create an instance of the FileInput class. The instance will be used
95
as global state for the functions of this module, and is also returned
96
to use during iteration. The parameters to this function will be passed
97
along to the constructor of the FileInput class.
100
if _state and _state._file:
101
raise RuntimeError, "input() already active"
102
_state = FileInput(files, inplace, backup, bufsize)
106
"""Close the sequence."""
115
Close the current file so that the next iteration will read the first
116
line from the next file (if any); lines not read from the file will
117
not count towards the cumulative line count. The filename is not
118
changed until after the first line of the next file has been read.
119
Before the first line has been read, this function has no effect;
120
it cannot be used to skip the first file. After the last line of the
121
last file has been read, this function has no effect.
124
raise RuntimeError, "no active input()"
125
return _state.nextfile()
129
Return the name of the file currently being read.
130
Before the first line has been read, returns None.
133
raise RuntimeError, "no active input()"
134
return _state.filename()
138
Return the cumulative line number of the line that has just been read.
139
Before the first line has been read, returns 0. After the last line
140
of the last file has been read, returns the line number of that line.
143
raise RuntimeError, "no active input()"
144
return _state.lineno()
148
Return the line number in the current file. Before the first line
149
has been read, returns 0. After the last line of the last file has
150
been read, returns the line number of that line within the file.
153
raise RuntimeError, "no active input()"
154
return _state.filelineno()
158
Returns true the line just read is the first line of its file,
159
otherwise returns false.
162
raise RuntimeError, "no active input()"
163
return _state.isfirstline()
167
Returns true if the last line was read from sys.stdin,
168
otherwise returns false.
171
raise RuntimeError, "no active input()"
172
return _state.isstdin()
175
"""class FileInput([files[, inplace[, backup]]])
177
Class FileInput is the implementation of the module; its methods
178
filename(), lineno(), fileline(), isfirstline(), isstdin(), nextfile()
179
and close() correspond to the functions of the same name in the module.
180
In addition it has a readline() method which returns the next
181
input line, and a __getitem__() method which implements the
182
sequence behavior. The sequence must be accessed in strictly
183
sequential order; random access and readline() cannot be mixed.
186
def __init__(self, files=None, inplace=0, backup="", bufsize=0):
187
if type(files) == type(''):
197
self._inplace = inplace
198
self._backup = backup
199
self._bufsize = bufsize or DEFAULT_BUFSIZE
200
self._savestdout = None
202
self._filename = None
206
self._isstdin = False
207
self._backupfilename = None
223
line = self._buffer[self._bufindex]
229
self._filelineno += 1
231
line = self.readline()
236
def __getitem__(self, i):
237
if i != self._lineno:
238
raise RuntimeError, "accessing lines out of order"
241
except StopIteration:
242
raise IndexError, "end of input reached"
245
savestdout = self._savestdout
248
sys.stdout = savestdout
250
output = self._output
257
if file and not self._isstdin:
260
backupfilename = self._backupfilename
261
self._backupfilename = 0
262
if backupfilename and not self._backup:
263
try: os.unlink(backupfilename)
266
self._isstdin = False
272
line = self._buffer[self._bufindex]
278
self._filelineno += 1
283
self._filename = self._files[0]
284
self._files = self._files[1:]
287
self._isstdin = False
288
self._backupfilename = 0
289
if self._filename == '-':
290
self._filename = '<stdin>'
291
self._file = sys.stdin
295
self._backupfilename = (
296
self._filename + (self._backup or os.extsep+"bak"))
297
try: os.unlink(self._backupfilename)
298
except os.error: pass
299
# The next few lines may raise IOError
300
os.rename(self._filename, self._backupfilename)
301
self._file = open(self._backupfilename, "r")
303
perm = os.fstat(self._file.fileno()).st_mode
305
self._output = open(self._filename, "w")
307
fd = os.open(self._filename,
308
os.O_CREAT | os.O_WRONLY | os.O_TRUNC,
310
self._output = os.fdopen(fd, "w")
312
if hasattr(os, 'chmod'):
313
os.chmod(self._filename, perm)
316
self._savestdout = sys.stdout
317
sys.stdout = self._output
319
# This may raise IOError
320
self._file = open(self._filename, "r")
321
self._buffer = self._file.readlines(self._bufsize)
326
return self.readline()
329
return self._filename
334
def filelineno(self):
335
return self._filelineno
337
def isfirstline(self):
338
return self._filelineno == 1
347
opts, args = getopt.getopt(sys.argv[1:], "ib:")
349
if o == '-i': inplace = 1
350
if o == '-b': backup = a
351
for line in input(args, inplace=inplace, backup=backup):
352
if line[-1:] == '\n': line = line[:-1]
353
if line[-1:] == '\r': line = line[:-1]
354
print "%d: %s[%d]%s %s" % (lineno(), filename(), filelineno(),
355
isfirstline() and "*" or "", line)
356
print "%d: %s[%d]" % (lineno(), filename(), filelineno())
358
if __name__ == '__main__':