stdin or optional fileinput

the.theorist the.theorist at gmail.com
Wed Mar 15 11:58:29 EST 2006


Steven Bethard wrote:
> the.theorist wrote:
> > I was writing a small script the other day with the following CLI
> > prog [options] [file]*
> >
> > I've used getopt to parse out the possible options, so we'll ignore
> > that part, and assume for the rest of the discussion that args is a
> > list of file names (if any provided).
> >
> > I used this bit of code to detect wether i want stdinput or not.
> >
> > if len(args)==0:
> >     args = [ sys.stdin ]
> >
> > Now in my main loop I've written:
> >
> > for file in args:
> >     for line in open( file ):
> >         #do stuff
>
> You should probably write:
>
> if not args:  # note that len(args) == 0 is repetitively redundant, over
>                # and over again, in a reiterative manner
>      files = [sys.stdin]
> else:
>      files = (open(filename) for filename in args)
>
> ...
>
> for fileobj in files:  # using the name 'file' is a bad idea since it
>                         # shadows the builtin 'file'
>      for line in fileobj:
>          # do stuff
>
>
> STeVe

I'll keep both those in mind for future programs.
my current fix has been

if not args:
    args = [ sys.stdin ]
else:
    map( open, args )

and then a modification to the main loop, as you proposed.

I thought that one day I might run into a problem opening too many
files though (esp if i used xargs in a pipe). And it just _feels_
better to open and close as I loop over the files list, rather than
open everything at the get go.

OH, i've noticed you used a generator that takes care of that. Except,
the machine I'm working on is currently stuck at Python 2.3. Still,
I'll keep your suggestions in mind for future coding.




More information about the Python-list mailing list