85
17.20 Module: Parsing a String into a Date/Time Object
Portably
Credit: Brett Cannon
Python's
time
module supplies the parsing function
strptime
only on some platforms, and
not on Windows. Example 17-2
shows a
strptime
function that is a pure Python
implementation of the
time.strptime
function that comes with Python. It is similar to how
time.strptime
is documented in the standard Python documentation. It accepts two more
optional arguments, as shown in the following signature:
strptime(string, format="%a %b %d %H:%M:%S %Y", option=AS_IS,
locale_setting=ENGLISH)
option
's default value of
AS_IS
gets time information from the string, without any checking
or filling-in. You can pass
option
as
CHECK
, so that the function makes sure that whatever
information it gets is within reasonable ranges (raising an exception otherwise), or
FILL_IN
(like
CHECK
, but also tries to fill in any missing information that can be computed).
locale_setting
accepts a locale tuple (as created by
LocaleAssembly
) to specify
names of days, months, and so on. Currently,
ENGLISH
and
SWEDISH
locale tuples are built
into this recipe's
strptime
module.
Although this recipe's
strptime
cannot be as fast as the version in the standard Python library,
that's hardly ever a major consideration for typical
strptime
use. This recipe does offer two
substantial advantages. It runs on any platform supporting Python and gives perfectly identical
results on different platforms, while
time.strptime
exists only on some platforms and tends
to have different quirks on each platform that supplies it. The optional checking and filling-in of
information that this recipe provides is also quite handy.
The locale-setting support of this version of
strptime
was inspired by that in Andrew
Markebo's own
strptime
, which you can find at http://www.fukt.hk-
r.se/~flognat/hacks/strptime.py
. However, this recipe has a more complete implementation of
strptime
's specification that is based on regular expressions, rather than relying on whitespace
and miscellaneous characters to split strings. For example, this recipe can correctly parse strings
based on a format such as
"%Y%m%d"
.
Example 17-2. Parsing a string into a date/time object portably
""" A pure-Python version of strptime.
As close as possible to time.strptime's specs in the
official Python docs.
Locales supported via LocaleAssembly -- examples supplied
for English and
Swedish, follow the examples to add your own locales.
Thanks to Andrew Markebo for his pure Python version of
strptime, which
convinced me to improve locale support -- and, of course, to
Guido van Rossum
and all other contributors to Python, the best language I've
ever used!