Hi all,
I have a utility that invokes webchecker on a number of different websites, given by a list, then mails the results to another list. I'm trying to trim off the last line in the results file (per invocation on a site), [...]
I'm not exactly sure why you're getting the specific errors that you showed, but I have some comments.
# loop through websites for site in websites: # Write headers for each site fp = open(outfile,'a') fp.write('\n' + site + '\n') fp.close() # Run the webchecker script and write results to file os.system("webchecker.py -q %s >> " %site + outfile ) # Trim off last line fp = open(outfile, 'r+') lines = fp.readlines() del lines[-1] fp.close()
First, I'd put all of this into a function. It'll help to organize your code and make things a little more clear. Second, when you build your system command, you're using % formatting *and* string addition -- why not just use % for both?
os.system("webchecker.py -q %s >> %s" % (site, outfile))
This would ensure that you're not having problems with operator precedence.
However, the most important point is that, when you read in the file that webchecker has just created, you're not actually *doing* anything with the data. Even if 'del lines[-1]' didn't throw an exception, it wouldn't accomplish what you want, because you never write your changes back to the file.
# Get local time runtime = strftime('%a %d %b %Y %H:%M:%S') # Create message fp = open(outfile,'r') msg = MIMEText(fp.read()) fp.close()
# Loop through recipients for you in recipients: me = "Webnanny" msg['Subject'] = 'Sites link check %s' % runtime msg['From'] = me msg['To']= you
server = smtplib.SMTP('hrrm.ucdavis.edu') server.set_debuglevel(1) #server.connect() server.sendmail(me, you, msg.as_string()) server.quit()
Several of the parts inside your loop are going to be the same each time through, so those should be pulled up out of the loop. Also, keep in mind that SMTP.sendmail() can fail or throw exceptions, and that you want to close the connection even if that happens (and probably that you want to keep trying other email addresses if it fails before the last one). That means you should use a try/finally block, something like this (modified from code of my own):
me = "Webnanny" msg['From'] = me msg['Subject'] = 'Sites link check %s' % runtime server = smtplib.SMTP(SMTPServer) try: for you in recipientlist: msg['To'] = you try: print server.sendmail(me, you, msg.as_string()) except: pass finally: server.quit()
As far as addressing your original problem, I'd suggest a somewhat different approach. Instead of having webchecker append repeatedly to a single file, and then trying to adjust that file's contents manually between each invocation of webchecker, it'd be simpler to use the tempfile module to create a new, temporary file for each invocation of webchecker. Then you read in each file in turn, and massage your data as you collect the file contents into a single list of lines. That list can then be join()ed and fed directly to MIMEText. This will save you from having any need to worry about append modes. (I suspect that your exceptions may be coming from reading from the end of the file.)
Jeff Shannon Technician/Programmer Credit International
_______________________________________________ ActivePython mailing list [EMAIL PROTECTED] To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs Other options: http://listserv.ActiveState.com/mailman/listinfo/ActivePython