Pythonic способ проверить ввод времени (только для часов, минут, секунд) - PullRequest
4 голосов
/ 16 января 2012

В моем приложении я получаю ввод времени в переменной в строковом формате, например Values = '12,12,12'.

Теперь мне нужно проверить его h<24 M<60 S<60 и т. Д., И я хочу получить окончательный вывод в формате '%H:%M:%S'.
Чтобы получить это, я попытался datetime.time().

Я первый раз попробовал с values = '12', затем '12,12,12'.

In [1]: import datetime

In [2]: values = '12'

In [3]: d = datetime.time(values)

TypeError  Traceback (most recent call last)
/mypc/test/<ipython console> in <module>()
TypeError: an integer is required

In [4]: d = datetime.time(int(values))

In [5]: d
Out[5]: datetime.time(12, 0)

In [6]: d.strftime('%H:%M:%S')
Out[6]: '12:00:00'

In [7]: s = d.strftime('%H:%M:%S')

In [8]: s
Out[8]: '12:00:00'

In [9]: values = '12,12,12'

In [10]: d = datetime.time(int(values))

ValueError: invalid literal for int() with base 10: '12,12,12'

Но это работает, как показано ниже.

In [24]: datetime.time(12,12,12).strftime('%H:%M:%S')
Out[24]: '12:12:12'

Так что проблема в том, что datetime.time () принимает входные данные как целое число, и '12,12,12' строка не может быть преобразована в целое число.

Есть ли другой способ (кроме регулярного выражения) выполнить проверку только для Hr: M: S.

Ответы [ 2 ]

5 голосов
/ 16 января 2012

Обратите внимание, что аналог strftime равен strptime, то есть, если вам нужно проанализировать время, вы можете использовать strptime, используя строку формата так же, как вы используете strftime для печати времени используя эту строку формата:

>>> import time
>>> t = time.strptime('12,12,12', '%H,%M,%S')
>>> time.strftime('%H:%M:%S', t)
'12:12:12'

Таким образом, strptime заботится о проверке (H<24, M<60, S<=61):

>>> time.strptime('24,0,0', '%H,%M,%S')
...
ValueError: time data '24,0,0' does not match format '%H,%M,%S'
>>> time.strptime('0,60,0', '%H,%M,%S')
...
ValueError: time data '0,60,0' does not match format '%H,%M,%S'
>>> time.strptime('0,0,62', '%H,%M,%S')
...
ValueError: unconverted data remains: 2

Обратите внимание, что strptime допускает S<=61, как описано в документации :

Диапазон действительно составляет от 0 до 61; это составляет високосные секунды и (очень редкие) двойные високосные секунды.

Если это проблема для вас, то вам, вероятно, нужно проанализировать это значение в вашем коде.

5 голосов
/ 16 января 2012

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

>>> values = '12,12,12'
>>> values = ast.literal_eval(values)
>>> datetime.time(*values)
datetime.time(12, 12, 12)

Это последнее утверждение вызовет ошибку, если указанное время неверно.

Чтобы избежать проблем с числами с нулем, как указано в «wim», можно изменить вторую строку на:

values = (int(i) for i in values.split(','))

или

values = map(int, values.split(','))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...