我正在从测量文件中解析日期(大约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()
>>>
答案 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