I'd suggest having the newfile open after outfile is defined also a close statement on newfile - or use it with 'with' such as: <unchanged code except removing "newfile = open('outfile', 'w')" line> ... and replace the last line like so: with open(outfile, 'w') as newfile: main(mystring, infile, newfile)
(and looking muchly improved, well done) Nick On Fri, Feb 1, 2013 at 8:57 PM, Scurvy Scott <etanes...@gmail.com> wrote: > And just for the records sake, this is what I've gotten and you guys > should see obviously that you helped a lot and I learned a thing or > two so I won't have to ask the same silly questions next time: > > > > > def main(mystring, infile, outfile): > with open('infile', 'r') as inF: > for index, line in enumerate(inF): > if myString in line: > newfile.write("string %s found on line > #%d" (line, index)) > print "complete." > > > if __name__ == '__main__': > import sys > newfile = open('outfile', 'w') > help_text = "usage: python scanfile.py STRINGTOSEARCH > IMPORTFILENAME OUTPUTFILENAME" > if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) == 0: > print (help_text) > sys.exit() > myString = sys.argv[1] > infile = sys.argv[2] > outfile = sys.argv[3] > main(mystring, infile, outfile) > > Look right to you? Looks okay to me, except maybe the three ORs in the > information line, is there a more pythonic way to accomplish that > task? > > Scott > > On Fri, Feb 1, 2013 at 8:31 PM, Scurvy Scott <etanes...@gmail.com> wrote: > >> Best practice is to check if your program is being run as a script > before > >> doing anything. That way you can still import the module for testing or > >> similar: > >> > >> > >> def main(mystring, infile, outfile): > >> # do stuff here > >> > >> > >> if __name__ == '__main__': > >> # Running as a script. > >> import sys > >> mystring = sys.argv[1] > >> infile = sys.argv[2] > >> outfile = sys.argv[3] > >> main(mystring, infile, outfile) > >> > >> > >> > >> Best practice for scripts (not just Python scripts, but *any* script) > is to > >> provide help when asked. Insert this after the "import sys" line, > before you > >> start processing: > >> > >> if '-h' in sys.argv or '--help' in sys.argv: > >> print(help_text) > >> sys.exit() > >> > >> > >> > >> If your argument processing is more complicated that above, you should > use > >> one of the three argument parsing modules that Python provides: > >> > >> http://docs.python.org/2/library/getopt.html > >> http://docs.python.org/2/library/optparse.html (deprecated -- do not > use > >> this for new code) > >> http://docs.python.org/2/library/argparse.html > >> > >> > >> getopt is (in my opinion) the simplest to get started, but the weakest. > >> > >> There are also third-party argument parsers that you could use. Here's > one > >> which I have never used but am intrigued by: > >> > >> http://docopt.org/ > >> > >> > >> > >> -- > >> Steven > >> > >> _______________________________________________ > >> Tutor maillist - Tutor@python.org > >> To unsubscribe or change subscription options: > >> http://mail.python.org/mailman/listinfo/tutor > > > > Steve- > > thanks a lot for showing me the if __name__ = main part > > I've often wondered how it was used and it didn't make sense until I > > saw it in my own code if that makes any sense. > > Also appreciate the help on the "instructional" side of things. > > > > One question related to the instruction aspect- does this make sense to > you? > > > > If len(sys.argv) == 0: > > print "usage: etc etc etc" > > > > > > > > Nick, Dave, and Steve, again, you guys are awesome. Thanks for all your > help. > > > > Scott > _______________________________________________ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > http://mail.python.org/mailman/listinfo/tutor >
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor