blob: 0764aa5e4d248070aea1fd365b815ca425233b56 [file] [log] [blame]
Guido van Rossum7d5b99d1997-11-21 17:12:59 +00001"""Helper class to quickly write a loop over all standard input files.
2
3Typical use is:
4
5 import fileinput
6 for line in fileinput.input():
7 process(line)
8
9This iterates over the lines of all files listed in sys.argv[1:],
10defaulting to sys.stdin if the list is empty. If a filename is '-' it
11is also replaced by sys.stdin. To specify an alternative list of
12filenames, pass it as the argument to input(). A single file name is
13also allowed.
14
15Functions filename(), lineno() return the filename and cumulative line
16number of the line that has just been read; filelineno() returns its
17line number in the current file; isfirstline() returns true iff the
18line just read is the first line of its file; isstdin() returns true
19iff the line was read from sys.stdin. Function nextfile() closes the
20current file so that the next iteration will read the first line from
21the next file (if any); lines not read from the file will not count
22towards the cumulative line count; the filename is not changed until
23after the first line of the next file has been read. Function close()
24closes the sequence.
25
26Before any lines have been read, filename() returns None and both line
27numbers are zero; nextfile() has no effect. After all lines have been
28read, filename() and the line number functions return the values
29pertaining to the last line read; nextfile() has no effect.
30
Georg Brandlc029f872006-02-19 14:12:34 +000031All files are opened in text mode by default, you can override this by
32setting the mode parameter to input() or FileInput.__init__().
Andrew Svetlovf7a17b42012-12-25 16:47:37 +020033If an I/O error occurs during opening or reading a file, the OSError
Georg Brandlc029f872006-02-19 14:12:34 +000034exception is raised.
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000035
36If sys.stdin is used more than once, the second and further use will
37return no lines, except perhaps for interactive use, or if it has been
38explicitly reset (e.g. using sys.stdin.seek(0)).
39
40Empty files are opened and immediately closed; the only time their
41presence in the list of filenames is noticeable at all is when the
42last file opened is empty.
43
44It is possible that the last line of a file doesn't end in a newline
45character; otherwise lines are returned including the trailing
46newline.
47
48Class FileInput is the implementation; its methods filename(),
49lineno(), fileline(), isfirstline(), isstdin(), nextfile() and close()
50correspond to the functions in the module. In addition it has a
51readline() method which returns the next input line, and a
52__getitem__() method which implements the sequence behavior. The
53sequence must be accessed in strictly sequential order; sequence
54access and readline() cannot be mixed.
55
56Optional in-place filtering: if the keyword argument inplace=1 is
57passed to input() or to the FileInput constructor, the file is moved
58to a backup file and standard output is directed to the input file.
59This makes it possible to write a filter that rewrites its input file
60in place. If the keyword argument backup=".<some extension>" is also
61given, it specifies the extension for the backup file, and the backup
62file remains around; by default, the extension is ".bak" and it is
63deleted when the output file is closed. In-place filtering is
64disabled when standard input is read. XXX The current implementation
65does not work for MS-DOS 8+3 filesystems.
66
67XXX Possible additions:
68
69- optional getopt argument processing
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000070- isatty()
71- read(), read(size), even readlines()
72
73"""
74
Walter Dörwald294bbf32002-06-06 09:48:13 +000075import sys, os
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000076
Georg Brandlef0a8652009-05-17 12:22:57 +000077__all__ = ["input", "close", "nextfile", "filename", "lineno", "filelineno",
Martin Panter7978e102016-01-16 06:26:54 +000078 "fileno", "isfirstline", "isstdin", "FileInput", "hook_compressed",
79 "hook_encoded"]
Skip Montanaroeccd02a2001-01-20 23:34:12 +000080
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000081_state = None
82
Georg Brandlef0a8652009-05-17 12:22:57 +000083def input(files=None, inplace=False, backup="", bufsize=0,
Georg Brandlc98eeed2006-02-19 14:57:47 +000084 mode="r", openhook=None):
Terry Jan Reedy70d2c712013-06-28 18:59:28 -040085 """Return an instance of the FileInput class, which can be iterated.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +000086
Terry Jan Reedy70d2c712013-06-28 18:59:28 -040087 The parameters are passed to the constructor of the FileInput class.
88 The returned instance, in addition to being an iterator,
89 keeps global state for the functions of this module,.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +000090 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000091 global _state
92 if _state and _state._file:
Collin Winterce36ad82007-08-30 01:19:48 +000093 raise RuntimeError("input() already active")
Georg Brandlc98eeed2006-02-19 14:57:47 +000094 _state = FileInput(files, inplace, backup, bufsize, mode, openhook)
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000095 return _state
96
97def close():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +000098 """Close the sequence."""
Guido van Rossum7d5b99d1997-11-21 17:12:59 +000099 global _state
100 state = _state
101 _state = None
102 if state:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000103 state.close()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000104
105def nextfile():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000106 """
107 Close the current file so that the next iteration will read the first
108 line from the next file (if any); lines not read from the file will
109 not count towards the cumulative line count. The filename is not
110 changed until after the first line of the next file has been read.
111 Before the first line has been read, this function has no effect;
112 it cannot be used to skip the first file. After the last line of the
Tim Peters8ac14952002-05-23 15:15:30 +0000113 last file has been read, this function has no effect.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000114 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000115 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000116 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000117 return _state.nextfile()
118
119def filename():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000120 """
121 Return the name of the file currently being read.
Tim Peters8ac14952002-05-23 15:15:30 +0000122 Before the first line has been read, returns None.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000123 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000124 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000125 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000126 return _state.filename()
127
128def lineno():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000129 """
130 Return the cumulative line number of the line that has just been read.
131 Before the first line has been read, returns 0. After the last line
Tim Peters8ac14952002-05-23 15:15:30 +0000132 of the last file has been read, returns the line number of that line.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000133 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000134 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000135 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000136 return _state.lineno()
137
138def filelineno():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000139 """
140 Return the line number in the current file. Before the first line
141 has been read, returns 0. After the last line of the last file has
Tim Peters8ac14952002-05-23 15:15:30 +0000142 been read, returns the line number of that line within the file.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000143 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000144 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000145 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000146 return _state.filelineno()
147
Georg Brandl67e9fb92006-02-19 13:56:17 +0000148def fileno():
149 """
150 Return the file number of the current file. When no file is currently
151 opened, returns -1.
152 """
153 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000154 raise RuntimeError("no active input()")
Georg Brandl67e9fb92006-02-19 13:56:17 +0000155 return _state.fileno()
156
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000157def isfirstline():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000158 """
159 Returns true the line just read is the first line of its file,
Tim Peters8ac14952002-05-23 15:15:30 +0000160 otherwise returns false.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000161 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000162 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000163 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000164 return _state.isfirstline()
165
166def isstdin():
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000167 """
168 Returns true if the last line was read from sys.stdin,
Tim Peters8ac14952002-05-23 15:15:30 +0000169 otherwise returns false.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000170 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000171 if not _state:
Collin Winterce36ad82007-08-30 01:19:48 +0000172 raise RuntimeError("no active input()")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000173 return _state.isstdin()
174
175class FileInput:
Terry Jan Reedy70d2c712013-06-28 18:59:28 -0400176 """FileInput([files[, inplace[, backup[, bufsize, [, mode[, openhook]]]]]])
Tim Peters8ac14952002-05-23 15:15:30 +0000177
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000178 Class FileInput is the implementation of the module; its methods
Georg Brandl67e9fb92006-02-19 13:56:17 +0000179 filename(), lineno(), fileline(), isfirstline(), isstdin(), fileno(),
180 nextfile() and close() correspond to the functions of the same name
181 in the module.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000182 In addition it has a readline() method which returns the next
183 input line, and a __getitem__() method which implements the
184 sequence behavior. The sequence must be accessed in strictly
Tim Peters8ac14952002-05-23 15:15:30 +0000185 sequential order; random access and readline() cannot be mixed.
Raymond Hettingerd1fa3db2002-05-15 02:56:03 +0000186 """
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000187
Georg Brandlef0a8652009-05-17 12:22:57 +0000188 def __init__(self, files=None, inplace=False, backup="", bufsize=0,
Georg Brandlc98eeed2006-02-19 14:57:47 +0000189 mode="r", openhook=None):
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000190 if isinstance(files, str):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000191 files = (files,)
Roy Williams002665a2017-05-22 22:24:17 -0700192 elif isinstance(files, os.PathLike):
193 files = (os.fspath(files), )
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000194 else:
Guido van Rossum2516b392000-04-10 17:16:12 +0000195 if files is None:
196 files = sys.argv[1:]
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000197 if not files:
Guido van Rossum2516b392000-04-10 17:16:12 +0000198 files = ('-',)
199 else:
200 files = tuple(files)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000201 self._files = files
202 self._inplace = inplace
203 self._backup = backup
Serhiy Storchaka674e2d02016-03-08 18:35:19 +0200204 if bufsize:
205 import warnings
206 warnings.warn('bufsize is deprecated and ignored',
207 DeprecationWarning, stacklevel=2)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000208 self._savestdout = None
209 self._output = None
210 self._filename = None
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200211 self._startlineno = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000212 self._filelineno = 0
213 self._file = None
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000214 self._isstdin = False
Guido van Rossum0aec9fb1998-07-20 15:49:28 +0000215 self._backupfilename = None
Georg Brandlc029f872006-02-19 14:12:34 +0000216 # restrict mode argument to reading modes
217 if mode not in ('r', 'rU', 'U', 'rb'):
218 raise ValueError("FileInput opening mode must be one of "
219 "'r', 'rU', 'U' and 'rb'")
Serhiy Storchaka6787a382013-11-23 22:12:06 +0200220 if 'U' in mode:
221 import warnings
Serhiy Storchaka2480c2e2013-11-24 23:13:26 +0200222 warnings.warn("'U' mode is deprecated",
Serhiy Storchaka6787a382013-11-23 22:12:06 +0200223 DeprecationWarning, 2)
Georg Brandlc029f872006-02-19 14:12:34 +0000224 self._mode = mode
Berker Peksagbe6dbfb2019-04-29 17:55:39 +0300225 self._write_mode = mode.replace('r', 'w') if 'U' not in mode else 'w'
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200226 if openhook:
227 if inplace:
228 raise ValueError("FileInput cannot use an opening hook in inplace mode")
229 if not callable(openhook):
230 raise ValueError("FileInput openhook must be callable")
Georg Brandlc98eeed2006-02-19 14:57:47 +0000231 self._openhook = openhook
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000232
233 def __del__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000234 self.close()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000235
236 def close(self):
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300237 try:
238 self.nextfile()
239 finally:
240 self._files = ()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000241
Georg Brandl6cb7b652010-07-31 20:08:15 +0000242 def __enter__(self):
243 return self
244
245 def __exit__(self, type, value, traceback):
246 self.close()
247
Neil Schemenauer908632a2002-03-26 20:28:40 +0000248 def __iter__(self):
249 return self
250
Georg Brandla18af4e2007-04-21 15:47:16 +0000251 def __next__(self):
Serhiy Storchaka0554d832016-03-08 23:35:35 +0200252 while True:
253 line = self._readline()
254 if line:
255 self._filelineno += 1
256 return line
257 if not self._file:
258 raise StopIteration
259 self.nextfile()
260 # repeat with next file
Tim Peters863ac442002-04-16 01:38:40 +0000261
Neil Schemenauer908632a2002-03-26 20:28:40 +0000262 def __getitem__(self, i):
Berker Peksag84a13fb2018-08-11 09:05:04 +0300263 import warnings
264 warnings.warn(
265 "Support for indexing FileInput objects is deprecated. "
266 "Use iterator protocol instead.",
267 DeprecationWarning,
268 stacklevel=2
269 )
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200270 if i != self.lineno():
Collin Winterce36ad82007-08-30 01:19:48 +0000271 raise RuntimeError("accessing lines out of order")
Neil Schemenauer908632a2002-03-26 20:28:40 +0000272 try:
Georg Brandla18af4e2007-04-21 15:47:16 +0000273 return self.__next__()
Neil Schemenauer908632a2002-03-26 20:28:40 +0000274 except StopIteration:
Collin Winterce36ad82007-08-30 01:19:48 +0000275 raise IndexError("end of input reached")
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000276
277 def nextfile(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000278 savestdout = self._savestdout
Serhiy Storchaka2116b122015-04-10 13:29:28 +0300279 self._savestdout = None
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000280 if savestdout:
281 sys.stdout = savestdout
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000282
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000283 output = self._output
Serhiy Storchaka2116b122015-04-10 13:29:28 +0300284 self._output = None
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300285 try:
286 if output:
287 output.close()
288 finally:
289 file = self._file
Serhiy Storchaka2116b122015-04-10 13:29:28 +0300290 self._file = None
Serhiy Storchaka0554d832016-03-08 23:35:35 +0200291 try:
292 del self._readline # restore FileInput._readline
293 except AttributeError:
294 pass
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300295 try:
296 if file and not self._isstdin:
297 file.close()
298 finally:
299 backupfilename = self._backupfilename
Serhiy Storchaka2116b122015-04-10 13:29:28 +0300300 self._backupfilename = None
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300301 if backupfilename and not self._backup:
302 try: os.unlink(backupfilename)
303 except OSError: pass
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000304
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300305 self._isstdin = False
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000306
307 def readline(self):
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200308 while True:
309 line = self._readline()
310 if line:
311 self._filelineno += 1
312 return line
313 if not self._file:
314 return line
315 self.nextfile()
316 # repeat with next file
317
Serhiy Storchaka0554d832016-03-08 23:35:35 +0200318 def _readline(self):
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200319 if not self._files:
320 if 'b' in self._mode:
321 return b''
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000322 else:
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200323 return ''
324 self._filename = self._files[0]
325 self._files = self._files[1:]
326 self._startlineno = self.lineno()
327 self._filelineno = 0
328 self._file = None
329 self._isstdin = False
330 self._backupfilename = 0
331 if self._filename == '-':
332 self._filename = '<stdin>'
333 if 'b' in self._mode:
334 self._file = getattr(sys.stdin, 'buffer', sys.stdin)
335 else:
336 self._file = sys.stdin
337 self._isstdin = True
338 else:
339 if self._inplace:
340 self._backupfilename = (
Zhiming Wang06de1ae2017-09-05 01:37:24 +0800341 os.fspath(self._filename) + (self._backup or ".bak"))
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200342 try:
343 os.unlink(self._backupfilename)
344 except OSError:
345 pass
346 # The next few lines may raise OSError
347 os.rename(self._filename, self._backupfilename)
348 self._file = open(self._backupfilename, self._mode)
349 try:
350 perm = os.fstat(self._file.fileno()).st_mode
351 except OSError:
Berker Peksagbe6dbfb2019-04-29 17:55:39 +0300352 self._output = open(self._filename, self._write_mode)
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200353 else:
354 mode = os.O_CREAT | os.O_WRONLY | os.O_TRUNC
355 if hasattr(os, 'O_BINARY'):
356 mode |= os.O_BINARY
357
358 fd = os.open(self._filename, mode, perm)
Berker Peksagbe6dbfb2019-04-29 17:55:39 +0300359 self._output = os.fdopen(fd, self._write_mode)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200360 try:
Anthony Sottile8377cd42019-02-25 14:32:27 -0800361 os.chmod(self._filename, perm)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200362 except OSError:
363 pass
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200364 self._savestdout = sys.stdout
365 sys.stdout = self._output
366 else:
367 # This may raise OSError
368 if self._openhook:
369 self._file = self._openhook(self._filename, self._mode)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000370 else:
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200371 self._file = open(self._filename, self._mode)
Serhiy Storchaka0554d832016-03-08 23:35:35 +0200372 self._readline = self._file.readline # hide FileInput._readline
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200373 return self._readline()
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000374
375 def filename(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000376 return self._filename
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000377
378 def lineno(self):
Serhiy Storchakacc2dbc52016-03-08 18:28:36 +0200379 return self._startlineno + self._filelineno
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000380
381 def filelineno(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000382 return self._filelineno
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000383
Georg Brandl67e9fb92006-02-19 13:56:17 +0000384 def fileno(self):
385 if self._file:
386 try:
387 return self._file.fileno()
388 except ValueError:
389 return -1
390 else:
391 return -1
392
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000393 def isfirstline(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000394 return self._filelineno == 1
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000395
396 def isstdin(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000397 return self._isstdin
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000398
Georg Brandlc98eeed2006-02-19 14:57:47 +0000399
400def hook_compressed(filename, mode):
401 ext = os.path.splitext(filename)[1]
402 if ext == '.gz':
403 import gzip
404 return gzip.open(filename, mode)
405 elif ext == '.bz2':
406 import bz2
407 return bz2.BZ2File(filename, mode)
408 else:
409 return open(filename, mode)
410
411
Serhiy Storchakab2752102016-04-27 23:13:46 +0300412def hook_encoded(encoding, errors=None):
Georg Brandlc98eeed2006-02-19 14:57:47 +0000413 def openhook(filename, mode):
Serhiy Storchakab2752102016-04-27 23:13:46 +0300414 return open(filename, mode, encoding=encoding, errors=errors)
Georg Brandlc98eeed2006-02-19 14:57:47 +0000415 return openhook
416
417
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000418def _test():
419 import getopt
Georg Brandlef0a8652009-05-17 12:22:57 +0000420 inplace = False
421 backup = False
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000422 opts, args = getopt.getopt(sys.argv[1:], "ib:")
423 for o, a in opts:
Georg Brandlef0a8652009-05-17 12:22:57 +0000424 if o == '-i': inplace = True
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000425 if o == '-b': backup = a
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000426 for line in input(args, inplace=inplace, backup=backup):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000427 if line[-1:] == '\n': line = line[:-1]
428 if line[-1:] == '\r': line = line[:-1]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000429 print("%d: %s[%d]%s %s" % (lineno(), filename(), filelineno(),
430 isfirstline() and "*" or "", line))
431 print("%d: %s[%d]" % (lineno(), filename(), filelineno()))
Guido van Rossum7d5b99d1997-11-21 17:12:59 +0000432
433if __name__ == '__main__':
434 _test()