time.strptime() undocumented difference python 2.5.1>2.5.2


T

TYR

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.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.(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.
 
Ad

Advertisements

M

MRAB

TYR said:
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.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.(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".
 
Ad

Advertisements

T

TYR

TYR said:
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

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".

Thank you; that was indeed the issue, which helped me discover that
email.Utils.formatdate() stopped accepting struct_times in the same
change and started wanting floats.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top