Mam metodę Pythona, która akceptuje dane wejściowe jako ciąg .
Jak dodać walidację, aby upewnić się, że ciąg daty przekazywany do metody znajduje się w pliku ffg. format:
'YYYY-MM-DD'
jeśli tak nie jest, metoda powinna wywołać jakiś błąd
Mam metodę Pythona, która akceptuje dane wejściowe jako ciąg .
Jak dodać walidację, aby upewnić się, że ciąg daty przekazywany do metody znajduje się w pliku ffg. format:
'YYYY-MM-DD'
jeśli tak nie jest, metoda powinna wywołać jakiś błąd
Odpowiedzi:
>>> import datetime
>>> def validate(date_text):
try:
datetime.datetime.strptime(date_text, '%Y-%m-%d')
except ValueError:
raise ValueError("Incorrect data format, should be YYYY-MM-DD")
>>> validate('2003-12-23')
>>> validate('2003-12-32')
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
validate('2003-12-32')
File "<pyshell#18>", line 5, in validate
raise ValueError("Incorrect data format, should be YYYY-MM-DD")
ValueError: Incorrect data format, should be YYYY-MM-DD
Pythondateutil
biblioteka jest przeznaczony do tego (i więcej). Automatycznie przekształci to w datetime
obiekt dla ciebie i podniesie, ValueError
jeśli nie może.
Jako przykład:
>>> from dateutil.parser import parse
>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)
Wiąże się ValueError
to z nieprawidłowym formatowaniem daty:
>>> parse("2003-09-251")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 720, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 317, in parse
ret = default.replace(**repl)
ValueError: day is out of range for month
dateutil
jest również niezwykle przydatny, jeśli w przyszłości będziesz musiał analizować inne formaty, ponieważ może inteligentnie obsługiwać większość znanych formatów i umożliwia modyfikowanie specyfikacji: dateutil
analizowanie przykładów .
Obsługuje również strefy czasowe, jeśli tego potrzebujesz.
Aktualizacja oparta na komentarzach : parse
akceptuje również argument słowa kluczowego, dayfirst
który kontroluje, czy dzień lub miesiąc ma być pierwszy, jeśli data jest niejednoznaczna. Domyślnie jest to False. Na przykład
>>> parse('11/12/2001')
>>> datetime.datetime(2001, 11, 12, 0, 0) # Nov 12
>>> parse('11/12/2001', dayfirst=True)
>>> datetime.datetime(2001, 12, 11, 0, 0) # Dec 11
parse('13/12/2001')
„13 grudnia”, ale parse('11/12/2001')
„12 listopada” (pierwszy wynik sugerowałby tutaj „11 grudnia”).
parse
w rzeczywistości przyjmuje dayfirst
argument słowa kluczowego, który pozwala ci to kontrolować. parse('11/12/2001', dayfirst=True)
zwróci „11 grudnia”. Dateutil domyślnie todayfirst=False
datetutil.parser.parse()
akceptuje zbyt wiele formatów czasu (możesz znaleźć inne przykłady z niejednoznacznymi danymi wejściowymi). Jeśli chcesz sprawdzić , czy wprowadzone dane są w formacie RRRR-MM-DD, parse()
funkcja jest niewłaściwym narzędziem.
.parse()
zwrócenie ciągu formatu oprócz datetime
obiektu?
Myślę, że pełna funkcja walidacji powinna wyglądać tak:
from datetime import datetime
def validate(date_text):
try:
if date_text != datetime.strptime(date_text, "%Y-%m-%d").strftime('%Y-%m-%d'):
raise ValueError
return True
except ValueError:
return False
Wykonywanie tylko
datetime.strptime(date_text, "%Y-%m-%d")
nie wystarczy, ponieważ metoda strptime nie sprawdza, czy miesiąc i dzień miesiąca są liczbami dziesiętnymi uzupełnionymi zerami. Na przykład
datetime.strptime("2016-5-3", '%Y-%m-%d')
zostanie wykonany bez błędów.
datetime.strptime(date_text, "%Y-%m-%d")
?
from datetime import datetime
datetime.strptime(date_string, "%Y-%m-%d")
.. wywołuje to, ValueError
jeśli otrzyma niezgodny format.
..jeśli masz do czynienia z datami i czasami (w sensie obiektów datetime, w przeciwieństwie do unx timestamp float), dobrym pomysłem jest zajrzenie do modułu pytz i przechowywanie / db, przechowywanie wszystkiego w UTC .
To najłatwiejszy sposób:
date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')