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__':