time.strptime() undocumented difference python 2.5.1>2.5.2
MRAB
google at mrabarnett.plus.com
Wed Mar 25 15:38:57 EDT 2009
TYR wrote:
> A server that runs one of my programs was upgraded to Debian Lenny
> last night, which moved it from Python 2.4.4 to 2.5.2. This caused
> immediate trouble. At one point, data is parsed from a Web page, and
> among other things a time date group is collected. This is in a nice
> human readable format, but I want it in RFC 822 format because it's
> going to be used in an outbound GeoRSS feed and it's a requirement.
>
> So the time group is split up with a regex, merged into one string,
> and fed to time.strptime() with a fitting format, then passed to
> Utils.formatdate() and used. The time group looks like this:
> 25/03/2009 21:05:00
>
> Code:
> if airline not in whitelist:
> retime = re.split('[-\s:/]', rawtime)
> timeinput = ''.join(retime)
> t = time.strptime(timeinput, "%d %m %Y %H %M %S")
> timeout = Utils.formatdate(t)
>
> Error:
> Traceback (most recent call
> last):
> File "/home/yorksranter/vfeed-data/bothv7.py", line 46, in
> <module>
> t = time.strptime(timeinput, "%d %m %Y %H %M
> %S")
> File "/usr/lib/python2.5/_strptime.py", line 330, in
> strptime
> (data_string,
> format))
> ValueError: time data did not match format: data=25032009210500 fmt=
> %d %m %Y %H %M %S
>
> Weirdness:
>
> Python 2.5.2 (r252:60911, Jan 4 2009, 21:59:32) #the
> server
> [GCC 4.3.2] on
> linux2
> Type "help", "copyright", "credits" or "license" for more
> information.
>>>> timeinput = '25032009210500'
>>>> import time
>>>> t = time.strptime(timeinput, "%d %m %Y %H %M %S")
> Traceback (most recent call
> last):
> File "<stdin>", line 1, in
> <module>
> File "/usr/lib/python2.5/_strptime.py", line 330, in
> strptime
> (data_string,
> format))
> ValueError: time data did not match format: data=25032009210500 fmt=
> %d %m %Y %H %M %S
>
> But....
>
> Python 2.5.1 (r251:54863, Jan 10 2008, 18:01:57) #the laptop
> [GCC 4.2.1 (SUSE Linux)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> import time
>>>> timeinput = '25032009210500'
>>>> t = time.strptime(timeinput, "%d %m %Y %H %M %S")
>>>> print t
> (2009, 3, 25, 21, 5, 0, 2, 84, -1)
>
> Docs (http://docs.python.org/library/time.html#time.strptime) say:
> Parses a string representing a time according to a format. If I send
> it through str() to make absolutely sure it is a string I get the same
> error.
>
> I note from the changelog that there was a change affecting
> time.strptime()...(http://www.python.org/download/releases/2.5.2/
> NEWS.txt)
>
> - Bug #1730389: Have time.strptime() match spaces in a format argument
> with
> ``\s+`` instead of ``\s*``.
>
> - Bug #1290505: Properly clear time.strptime's locale cache when the
> locale
> changes between calls. Backport of r54646 and r54647.
>
> I don't see that either of these should break it, but it's got to be a
> suspect.
>
I think it's due to bug #1730389. This says that a space in the format
string should match _at least one_ space in the string it's parsing.
Your format is "%d %m %Y %H %M %S" (it contains spaces) but your string
is "25032009210500" (it doesn't contain spaces), hence the failure.
I suggest you change:
timeinput = ''.join(retime)
to:
timeinput = ' '.join(retime)
It'll make the string a little clearer anyway: "25 03 2009 21 05 00".
More information about the Python-list
mailing list