在格式不匹配的情况下,防止datetime.strptime退出

时间:2015-10-08 06:39:58

标签: python datetime

我正在从测量文件中解析日期(大约200k行)。格式是日期和度量。日期格式为“2013-08-07-20-46”或时间格式为“%Y-%m-%d-%H-%M”。时间戳往往有一个坏的性格。 (数据来自中断的串行链路)。条目如下:201-08-11-05-15。

我将时间字符串转换为秒的解析行是:

time.mktime(datetime.datetime.strptime(dt, "%Y-%m-%d-%H-%M").timetuple())

我在网上得到它并且不完全理解它是如何工作的。 (但它有效)

我的问题是防止程序在格式不匹配时抛出错误退出。有没有办法防止strptime没有退出但优雅地返回错误标志,在这种情况下我会简单地丢弃数据线并继续下一步。是的,我可以使用regexp执行模式检查,但我想知道是否已将某些智能不匹配处理内置到strptime中。

追加@Anand S Kumar

它适用于一些坏线,但后来失败了。

fp = open('bmp085.dat', 'r')
for line in fp:
    [dt,t,p]= string.split(line)
    try:
        sec= time.mktime(datetime.datetime.strptime(dt, "%Y-%m-%d-%H-%M").timetuple()) - sec0
    except ValueError:
        print 'Bad data : ' + line
        continue #If you are doing this in a loop (looping over the lines) so that it moves onto next iteration
    print sec, p ,t
t_list.append(sec)
p_list.append(p)

fp.close()

输出:

288240.0 1014.48 24.2
288540.0 1014.57 24.2
288840.0 1014.46 24.2
Bad data : �013-08-11-05-05   24.2!  1014.49

Bad data : 2013=0▒-11-05-10  �24.2   1014.57

Bad data : 201�-08-11-05-15   24.1   1014.57

Bad data : "0�#-08-1!-p5-22   24.1   1014.6

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: too many values to unpack
>>> 

追加@Anand S Kumar

它又崩溃了。

for line in fp:
    print line
    dt,t,p = line.split(' ',2)
    try:
        sec= time.mktime(datetime.datetime.strptime(dt, "%Y-%m-%d-%H-%M").timetuple()) - sec0
    except ValueError:
        print 'Bad data : ' + line
        continue #If you are doing this in a loop (looping over the lines) so that it moves onto next iteration
    print sec, p ,t

失败:

2013-08-11�06-t5   03/9   9014.y

Bad data : 2013-08-11�06-t5   03/9   9014.y

2013-08-11-06-50  (23.   1014.96

295440.0 (23.   1014.96

2013-08-11-06%55  23.9 !�1015.01

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
TypeError: must be string without null bytes, not str
>>> fp.close()
>>> 

2 个答案:

答案 0 :(得分:1)

您可以使用try..except捕获任何ValueError,如果发生任何此类错误,请转到下一行。示例 -

try:
    time.mktime(datetime.datetime.strptime(dt, "%Y-%m-%d-%H-%M").timetuple())
except ValueError:
    continue #If you are doing this in a loop (looping over the lines) so that it moves onto next iteration

如果您正在做其他事情(可能就像每行的函数调用一样,那么在except块中返回None左右)

你得到的第二个ValueError应该排成一行 -

[dt,t,p]= string.split(line)

发生此问题是因为可能存在导致超过3个元素的特定行。您可以做的一件事是使用maxspplit中的str.split()参数最多分割3次。示例 -

dt,t,p = line.split(None,2)

或者如果你真的想使用string.split() -

[dt,t,p]= string.split(line,None,2)

或者,如果您不希望任何字段中包含space,则可以在ValueError块中包含导致try..except的行,并将其视为坏行。

答案 1 :(得分:0)

try - except循环中使用for

for dt in data:
    try:
        print time.mktime(datetime.datetime.strptime(dt, "%Y-%m-%d-%H-%M").timetuple())
    except ValueError:
        print "Wrong format!"
        continue

data = ["1998-05-14-15-45","11998-05-14-15-45","2002-05-14-15-45"]的输出:

895153500.0
Wrong format!
1021383900.0