I'm trying to think about how to do this in a better pythonic way. Now the only way I can think of is to overdo it.
The user enters the date (via the command line) in one of the following ways (e.g. / mypy.py date = '20110909.00 23')
date='20110909' date='20110909.00 23' date='20110909.00 20110909.23'
All three examples should have the same result, no matter if it fills the list (which I can sort), for example
['20110909.00', '20110909.23]
or even two sorted separate variables, but in all cases it is YYYYMMDD.HH, and you need to make sure that it is really a date, not a text.
Any ideas?
Thanks.
+++++ EDIT +++++ After connecting to this, I think I needed to do a lot of date / manipulation checks in the first place. Everything seems to work just fine. Except at the very end, I run the list through a date check, and it fails every time - even when it should pass.
(I run it with). /test.py date = '20110909.00 23'
(or any date option - that is, date = '20 22 'or date =' 20110909 'or date =' 20110909.00 23 ', etc.)
import sys, re, time, datetime now = datetime.datetime.now() tempdate=[] strfirstdate=None strtempdate=None temparg2 = sys.argv del temparg2[0] tempdate = temparg2[0].replace('date=','') date = tempdate.split(' '); tempdate=[] date.sort(key=len, reverse=True) result = None # If no date is passed then create list according to [YYMMDD.HH, YYMMDD.HH] if date[0] == 'None': tempdate.extend([now.strftime('%Y%m%d.00'), now.strftime('%Y%m%d.%H')]) # If length of date list is 1 than see if it is YYMMDD only or HH only, and create list according to [YYMMDD.HH, YYMMDD.HH] elif len(date) == 1: if len(date[0]) == 8: tempdate.extend([ date[0] + '.00', date[0] + '.23']) elif len(date[0]) == 2: tempdate.extend([now.strftime('%Y%m%d') + '.' + date[0], now.strftime('%Y%m%d') + '.' + date[0]]) else: tempdate.extend([date[0], date[0]]) # iterate through list, see if value is YYMMDD only or HH only or YYYYMMDD.HH, and create list accoring to [YYYYMMDD.HH, YYYYMMDD.HH] - maximum of 2 values else: for _ in range(2): if len(date[_]) == 8: strfirstdate = date[0] tempdate.append([ date[_] + '.00']) elif len(date[_]) == 2: if _ == 0: # both values passed could be hours only tempdate.append(now.strftime('%Y%m%d') + '.' + date[_]) else: # we must be at the 2nd value passed. if strfirstdate == None: tempdate.append(now.strftime('%Y%m%d') + '.' + date[_]) else: tempdate.append(strfirstdate + '.' + date [_]) else: strfirstdate = date[0][:8] tempdate.append(date[_]) tempdate.sort() for s in tempdate: try: result = datetime.datetime.strptime(s, '%Y%m%d.%H') except: pass if result is None: print 'Malformed date.' else: print 'Date is fine.' print tempdate
++++ Edit 2 ++++ If I remove the bottom (after tempdate.sort ()) and replace it with this.
strfirstdate = re.compile(r'([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]+\.[0-9][0-9])') for s in tempdate: if re.match(strfirstdate, s): result = "validated" else: print "#####################" print "#####################" print "## error in date ##" print "#####################" print "#####################" exit
It will be checked correctly.
This whole method does not seem to be very pythonic.