6464disabled when standard input is read. XXX The current implementation
6565does not work for MS-DOS 8+3 filesystems.
6666
67- Performance: this module is unfortunately one of the slower ways of
68- processing large numbers of input lines. Nevertheless, a significant
69- speed-up has been obtained by using readlines(bufsize) instead of
70- readline(). A new keyword argument, bufsize=N, is present on the
71- input() function and the FileInput() class to override the default
72- buffer size.
73-
7467XXX Possible additions:
7568
7669- optional getopt argument processing
8780
8881_state = None
8982
90- DEFAULT_BUFSIZE = 8 * 1024
91-
9283def input (files = None , inplace = False , backup = "" , bufsize = 0 ,
9384 mode = "r" , openhook = None ):
9485 """Return an instance of the FileInput class, which can be iterated.
@@ -208,17 +199,19 @@ def __init__(self, files=None, inplace=False, backup="", bufsize=0,
208199 self ._files = files
209200 self ._inplace = inplace
210201 self ._backup = backup
211- self ._bufsize = bufsize or DEFAULT_BUFSIZE
202+ if bufsize :
203+ import warnings
204+ warnings .warn ('bufsize is deprecated and ignored' ,
205+ DeprecationWarning , stacklevel = 2 )
212206 self ._savestdout = None
213207 self ._output = None
214208 self ._filename = None
215- self ._lineno = 0
209+ self ._startlineno = 0
216210 self ._filelineno = 0
217211 self ._file = None
212+ self ._readline = self ._start_readline
218213 self ._isstdin = False
219214 self ._backupfilename = None
220- self ._buffer = []
221- self ._bufindex = 0
222215 # restrict mode argument to reading modes
223216 if mode not in ('r' , 'rU' , 'U' , 'rb' ):
224217 raise ValueError ("FileInput opening mode must be one of "
@@ -254,22 +247,18 @@ def __iter__(self):
254247 return self
255248
256249 def __next__ (self ):
257- try :
258- line = self ._buffer [self ._bufindex ]
259- except IndexError :
260- pass
261- else :
262- self ._bufindex += 1
263- self ._lineno += 1
250+ line = self ._readline ()
251+ if line :
264252 self ._filelineno += 1
265253 return line
266- line = self .readline ()
267- if not line :
254+ if not self ._file :
268255 raise StopIteration
269- return line
256+ self .nextfile ()
257+ # Recursive call
258+ return self .__next__ ()
270259
271260 def __getitem__ (self , i ):
272- if i != self ._lineno :
261+ if i != self .lineno () :
273262 raise RuntimeError ("accessing lines out of order" )
274263 try :
275264 return self .__next__ ()
@@ -290,6 +279,7 @@ def nextfile(self):
290279 finally :
291280 file = self ._file
292281 self ._file = None
282+ self ._readline = self ._start_readline
293283 try :
294284 if file and not self ._isstdin :
295285 file .close ()
@@ -301,85 +291,81 @@ def nextfile(self):
301291 except OSError : pass
302292
303293 self ._isstdin = False
304- self ._buffer = []
305- self ._bufindex = 0
306294
307295 def readline (self ):
308- try :
309- line = self ._buffer [self ._bufindex ]
310- except IndexError :
311- pass
296+ while True :
297+ line = self ._readline ()
298+ if line :
299+ self ._filelineno += 1
300+ return line
301+ if not self ._file :
302+ return line
303+ self .nextfile ()
304+ # repeat with next file
305+
306+ def _start_readline (self ):
307+ if not self ._files :
308+ if 'b' in self ._mode :
309+ return b''
310+ else :
311+ return ''
312+ self ._filename = self ._files [0 ]
313+ self ._files = self ._files [1 :]
314+ self ._startlineno = self .lineno ()
315+ self ._filelineno = 0
316+ self ._file = None
317+ self ._isstdin = False
318+ self ._backupfilename = 0
319+ if self ._filename == '-' :
320+ self ._filename = '<stdin>'
321+ if 'b' in self ._mode :
322+ self ._file = getattr (sys .stdin , 'buffer' , sys .stdin )
323+ else :
324+ self ._file = sys .stdin
325+ self ._isstdin = True
312326 else :
313- self ._bufindex += 1
314- self ._lineno += 1
315- self ._filelineno += 1
316- return line
317- if not self ._file :
318- if not self ._files :
319- if 'b' in self ._mode :
320- return b''
327+ if self ._inplace :
328+ self ._backupfilename = (
329+ self ._filename + (self ._backup or ".bak" ))
330+ try :
331+ os .unlink (self ._backupfilename )
332+ except OSError :
333+ pass
334+ # The next few lines may raise OSError
335+ os .rename (self ._filename , self ._backupfilename )
336+ self ._file = open (self ._backupfilename , self ._mode )
337+ try :
338+ perm = os .fstat (self ._file .fileno ()).st_mode
339+ except OSError :
340+ self ._output = open (self ._filename , "w" )
321341 else :
322- return ''
323- self ._filename = self ._files [0 ]
324- self ._files = self ._files [1 :]
325- self ._filelineno = 0
326- self ._file = None
327- self ._isstdin = False
328- self ._backupfilename = 0
329- if self ._filename == '-' :
330- self ._filename = '<stdin>'
331- if 'b' in self ._mode :
332- self ._file = getattr (sys .stdin , 'buffer' , sys .stdin )
333- else :
334- self ._file = sys .stdin
335- self ._isstdin = True
336- else :
337- if self ._inplace :
338- self ._backupfilename = (
339- self ._filename + (self ._backup or ".bak" ))
342+ mode = os .O_CREAT | os .O_WRONLY | os .O_TRUNC
343+ if hasattr (os , 'O_BINARY' ):
344+ mode |= os .O_BINARY
345+
346+ fd = os .open (self ._filename , mode , perm )
347+ self ._output = os .fdopen (fd , "w" )
340348 try :
341- os .unlink (self ._backupfilename )
349+ if hasattr (os , 'chmod' ):
350+ os .chmod (self ._filename , perm )
342351 except OSError :
343352 pass
344- # The next few lines may raise OSError
345- os .rename (self ._filename , self ._backupfilename )
346- self ._file = open (self ._backupfilename , self ._mode )
347- try :
348- perm = os .fstat (self ._file .fileno ()).st_mode
349- except OSError :
350- self ._output = open (self ._filename , "w" )
351- else :
352- mode = os .O_CREAT | os .O_WRONLY | os .O_TRUNC
353- if hasattr (os , 'O_BINARY' ):
354- mode |= os .O_BINARY
355-
356- fd = os .open (self ._filename , mode , perm )
357- self ._output = os .fdopen (fd , "w" )
358- try :
359- if hasattr (os , 'chmod' ):
360- os .chmod (self ._filename , perm )
361- except OSError :
362- pass
363- self ._savestdout = sys .stdout
364- sys .stdout = self ._output
353+ self ._savestdout = sys .stdout
354+ sys .stdout = self ._output
355+ else :
356+ # This may raise OSError
357+ if self ._openhook :
358+ self ._file = self ._openhook (self ._filename , self ._mode )
365359 else :
366- # This may raise OSError
367- if self ._openhook :
368- self ._file = self ._openhook (self ._filename , self ._mode )
369- else :
370- self ._file = open (self ._filename , self ._mode )
371- self ._buffer = self ._file .readlines (self ._bufsize )
372- self ._bufindex = 0
373- if not self ._buffer :
374- self .nextfile ()
375- # Recursive call
376- return self .readline ()
360+ self ._file = open (self ._filename , self ._mode )
361+ self ._readline = self ._file .readline
362+ return self ._readline ()
377363
378364 def filename (self ):
379365 return self ._filename
380366
381367 def lineno (self ):
382- return self ._lineno
368+ return self ._startlineno + self . _filelineno
383369
384370 def filelineno (self ):
385371 return self ._filelineno
0 commit comments