2012-06-18 2 views
0

Я пишу программу, которая использует информацию о сборах из файла для вывода позже, моя проблема прямо сейчас заключается в тестировании предоставленной информации. Я хочу проверить, совпадает ли введенный пользователем код с датой в файле. Используемый файл содержит даты и продажи в форме YYYY, MM, DD. Я пытаюсь использовать цикл for, чтобы проверить каждую строку файла на вход пользователя, но я получаю сообщение об ошибке, которое datetime.date не является итерируемым. Любые решения/альтернативы? Вот код,Использование цикла для проверки даты с datetime в python?

from datetime import date 

def DateTest(Date, Position): 

    firstTry = True 
    validSyntax = False 
    if validSyntax == False: 

     if firstTry == True: 
      try: 
       Date = Date.strip().split(',') 
       Year = int(Date[0]) 
       Month = int(Date[1]) 
       Day = int(Date[2]) 
       Date = date(Year, Month, Day) 
      except: 
       print "That is invalid input." 
       firstTry = False 
      else: 
       validSyntax = True 

     elif firstTry == False: 
      Date = raw_input("Please input the desired %s date in the form YYYY,MM,DD: " % Position) 
      try : 
       Date = startDate.strip().split(',') 
       Year = int(Date[0]) 
       Month = int(Date[1]) 
       Day = int(Date[2]) 
       Date = date(Year, Month, Day) 
      except: 
       print "That is invalid input." 
      else: 
       validSyntax = True 
       print" ok got it" 

     if validSyntax == True: 
      for line in Date: 
       line = line.strip().split(',') 
       yearTest = int(line[0]) 
       monthTest = int(line[1]) 
       dayTest = int(line[2]) 
       dateTest = date(yearTest, monthTest, dayTest) 
       if dateTest == Date: 
        "print debug" 
startDate = raw_input("Please input the desired start date: ") 
start = "start" 
Response = DateTest(startDate, start) 

Как вы можете видеть, что я проверить на правильный ввод, а затем проверить на дату, находящейся в файл, который говорит мне, дата и время не итерация.

+0

Fyi, [PEP-8] (http://www.python.org/dev/peps/pep-0008/) говорит вам не использовать 'x == False' или' x == True', а просто 'x' и' not x'. Если вы не работаете с существующей базой кода, использующей стиль имени, который вы используете, я также предлагаю вам прочитать соответствующую часть PEP-8. Другие разработчики python, которые будут работать с вашим кодом в какой-то момент, будут вам за это! – ThiefMaster

+0

Я бы * сильно * предлагаю не использовать неопределенный исключающий оператор. Это улавливает НИЧЕГО, что может пойти не так, и выполняет ваш код исключений, несмотря на любую ошибку. Кроме того, если вы хотите получить точную трассировку кодового блока, используйте 'raise' для повышения ошибки, вызвавшей оператор except. –

ответ

0

В настоящее время, если я положил заявление на печать прямо перед циклом:

if validSyntax == True: 
     print Date 
     for line in Date: 
      ... 

он печатает:

1995-06-24 

Это не список, и поэтому не итерация.

Вы преобразовав его из списка на сегодняшний день объект здесь:

Date = date(Year, Month, Day) 

Если вы удалите эту строку, она остается в виде списка, а не даты типа.

1

Используйте strptime, он очистит ваш код.

>>> s = "1994,05,24" 
>>> datetime_obj = datetime.datetime.strptime(s, "%Y,%m,%d") 
>>> datetime_obj 
datetime.datetime(1994, 5, 24, 0, 0) 

Обратите внимание, что это дает вам объект типа DateTime, если вы хотите только дату можно назвать .date() на нем.

>>> date_obj = datetime_obj.date() 

Если вы хотите перебрать файл, вам нужно иметь объект файла или имя файла, чтобы затем преобразовать в объект файла. Если ваш формат файла csv, модуль csv может быть полезным, но если файл представляет собой всего лишь список дат, вам может и не понадобиться.