我创建了一个名为normalized_rec(raw_rec)
的函数def normalized_rec(raw_recs):
import time
import os
for rec in raw_recs:
jday = time.strftime('%j',time.strptime(' '.join(rec[4:6]+rec[7:8]),'%b %d %Y'))
jday2 = time.strftime('%j',time.strptime(' '.join(rec[10:12]+rec[13:14]), '%b %d %Y'))
if jday == jday2:
norm_rec = []
norm_rec.append(rec.copy())
return norm_rec
else:
# calculate next day string in 'WoD Month Day HH:MM:SS YYYY'
new_rec1 = rec.copy()
new_rec = rec.copy()
t_next = time.mktime(time.strptime(' '.join(new_rec1[4:6]+rec[7:8]),'%b %d %Y'))+86400
next_day = time.strftime('%a %b %d %H:%M:%S %Y',time.strptime(time.ctime(t_next))).split()
new_rec1[12] = '23:59:59'
new_rec1[9] = new_rec1[3]
new_rec1[10] = new_rec1[4]
new_rec1[11] = new_rec1[5]
new_rec[3] = next_day[0] # Day of week Sun, Mon, Tue...
new_rec[4] = next_day[1] # Month Jan, Feb, Mar, ...
new_rec[5] = next_day[2] # Day of Month 01, 02, ...
new_rec[6] = next_day[3] # Time HH:MM:SS
new_rec[7] = next_day[4] # Year YYYY
norm_rec = normalized_rec(new_rec)
normalized_recs = norm_rec.copy()
normalized_recs.insert(0,new_rec1) # call normalized_rec function recursive
return normalized_recs
我在login_rec列表中有原始数据
login_rec的内容 -
[['rchan','pts / 9','10 .40.91.236','Tue','Feb','13','16:53:42', '2018',' - ','星期二','二月','15','16:57:02','2018','(00:03)'], ['cwsmith','pts / 6','10 .40.43.94','星期二','二月','13','16:51:47', '2018',' - ','星期二','二月','13','16:56:13','2018','(00:04)'], ['mlee18','pts / 6','10 .40.43.94','星期二','二月','13','16:50:20', '2018',' - ','星期二','二月','13','16:51:27','2018','(00:01)'], ['hfang','pts / 4','24 .114.50.50','星期二','二月','13','16:31:38', '2018',' - ','星期二','二月','13','17:48:39','2018','(01:17)'], ['bigia','pts / 8','24 .114.50.50','星期二','二月','13','19:28:43', '2018',' - ','星期二','二月','13','20:28:31','2018','(00:59)'], ['rchan','pts / 2','10 .40.91.236','星期二','二月','13','16:22:00', '2018',' - ','星期二','二月','13','16:45:00','2018','(00:23)'], ['asmith','pts / 2','10 .43.115.162','星期二','二月','13','16:19:29', '2018',' - ','星期二','二月','13','16:22:00','2018','(00:02)'], ['tsliu2','pts / 4','10 .40.105.130','星期二','二月','13','16:17:21', '2018',' - ','星期二','二月','13','16:30:10','2018','(00:12)'], ['mshana','pts / 13','10 .40.91.247','星期二','二月','13','16:07:52', '2018',' - ','星期二','二月','13','16:45:52','2018','(00:38)'], ['asmith','pts / 11','10 .40.105.130','星期二','二月','13','14:07:43', '2018',' - ','星期二','二月','13','16:07:43','2018','(02:00)']]
如果我执行login_rec [0],则会出现
['rchan','pts / 9','10 .40.91.236','Tue','Feb','13','16:53:42', '2018',' - ','星期二','二月','15','16:57:02','2018','(00:03)']
所以,如果我做normalized_rec(login_rec)
我收到此错误我不知道为什么
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 26, in normalized_rec
File "<stdin>", line 5, in normalized_rec
File "/usr/lib64/python3.4/_strptime.py", line 501, in _strptime_time
tt = _strptime(data_string, format)[0]
File "/usr/lib64/python3.4/_strptime.py", line 344, in _strptime
(data_string, format))
ValueError: time data 'n' does not match format '%b %d %Y'
我导入了所有模块
由于
答案 0 :(得分:0)
你应该学习一些基本的调试策略。我用最低技术的方法追踪你的价值观:print
命令。我只是追踪执行和价值观:
def normalized_rec(raw_recs):
import time
import os
for rec in raw_recs:
print("\nrec\t", rec)
print("4:6\t", rec[4:6])
print("7:8\t", rec[7:8])
jday = time.strftime('%j',time.strptime(' '.join(rec[4:6]+rec[7:8]),'%b %d %Y'))
jday2 = time.strftime('%j',time.strptime(' '.join(rec[10:12]+rec[13:14]), '%b %d %Y'))
if jday == jday2:
print("TRACE dates match")
norm_rec = []
norm_rec.append(rec.copy())
return norm_rec
else:
# calculate next day string in 'WoD Month Day HH:MM:SS YYYY'
print("TRACE dates differ")
new_rec1 = rec.copy()
new_rec = rec.copy()
t_next = time.mktime(time.strptime(' '.join(new_rec1[4:6]+rec[7:8]),'%b %d %Y'))+86400
next_day = time.strftime('%a %b %d %H:%M:%S %Y',time.strptime(time.ctime(t_next))).split()
new_rec1[12] = '23:59:59'
new_rec1[9] = new_rec1[3]
new_rec1[10] = new_rec1[4]
new_rec1[11] = new_rec1[5]
new_rec[3] = next_day[0] # Day of week Sun, Mon, Tue...
new_rec[4] = next_day[1] # Month Jan, Feb, Mar, ...
new_rec[5] = next_day[2] # Day of Month 01, 02, ...
new_rec[6] = next_day[3] # Time HH:MM:SS
new_rec[7] = next_day[4] # Year YYYY
print("BEFORE recursion:\nnew_rec1\t", new_rec1, "\nnew_rec\t", new_rec)
print("RECUR\t", new_rec)
norm_rec = normalized_rec(new_rec)
normalized_recs = norm_rec.copy()
normalized_recs.insert(0,new_rec1) # call normalized_rec function recursive
print("RETURN dates differ")
return normalized_recs
login_rec = [['rchan', 'pts/9', '10.40.91.236', 'Tue', 'Feb', '13', '16:53:42', '2018', '-', 'Tue', 'Feb', '15', '16:57:02', '2018', '(00:03)'], ['cwsmith', 'pts/6', '10.40.43.94', 'Tue', 'Feb', '13', '16:51:47', '2018', '-', 'Tue', 'Feb', '13', '16:56:13', '2018', '(00:04)'], ['mlee18', 'pts/6', '10.40.43.94', 'Tue', 'Feb', '13', '16:50:20', '2018', '-', 'Tue', 'Feb', '13', '16:51:27', '2018', '(00:01)'], ['hfang', 'pts/4', '24.114.50.50', 'Tue', 'Feb', '13', '16:31:38', '2018', '-', 'Tue', 'Feb', '13', '17:48:39', '2018', '(01:17)'], ['bigia', 'pts/8', '24.114.50.50', 'Tue', 'Feb', '13', '19:28:43', '2018', '-', 'Tue', 'Feb', '13', '20:28:31', '2018', '(00:59)'], ['rchan', 'pts/2', '10.40.91.236', 'Tue', 'Feb', '13', '16:22:00', '2018', '-', 'Tue', 'Feb', '13', '16:45:00', '2018', '(00:23)'], ['asmith', 'pts/2', '10.43.115.162', 'Tue', 'Feb', '13', '16:19:29', '2018', '-', 'Tue', 'Feb', '13', '16:22:00', '2018', '(00:02)'], ['tsliu2', 'pts/4', '10.40.105.130', 'Tue', 'Feb', '13', '16:17:21', '2018', '-', 'Tue', 'Feb', '13', '16:30:10', '2018', '(00:12)'], ['mshana', 'pts/13', '10.40.91.247', 'Tue', 'Feb', '13', '16:07:52', '2018', '-', 'Tue', 'Feb', '13', '16:45:52', '2018', '(00:38)'], ['asmith', 'pts/11', '10.40.105.130', 'Tue', 'Feb', '13', '14:07:43', '2018', '-', 'Tue', 'Feb', '13', '16:07:43', '2018', '(02:00)']]
print("CALL\t", login_rec[0])
print("RESULT: ", normalized_rec(login_rec))
输出:
CALL ['rchan', 'pts/9', '10.40.91.236', 'Tue', 'Feb', '13', '16:53:42', '2018', '-', 'Tue', 'Feb', '15', '16:57:02', '2018', '(00:03)']
rec ['rchan', 'pts/9', '10.40.91.236', 'Tue', 'Feb', '13', '16:53:42', '2018', '-', 'Tue', 'Feb', '15', '16:57:02', '2018', '(00:03)']
4:6 ['Feb', '13']
7:8 ['2018']
TRACE dates differ
BEFORE recursion:
new_rec1 ['rchan', 'pts/9', '10.40.91.236', 'Tue', 'Feb', '13', '16:53:42', '2018', '-', 'Tue', 'Feb', '13', '23:59:59', '2018', '(00:03)']
new_rec ['rchan', 'pts/9', '10.40.91.236', 'Wed', 'Feb', '14', '00:00:00', '2018', '-', 'Tue', 'Feb', '15', '16:57:02', '2018', '(00:03)']
RECUR ['rchan', 'pts/9', '10.40.91.236', 'Wed', 'Feb', '14', '00:00:00', '2018', '-', 'Tue', 'Feb', '15', '16:57:02', '2018', '(00:03)']
rec rchan
4:6 n
7:8
Traceback (most recent call last):
File "so.py", line 44, in <module>
print("RESULT: ", normalized_rec(login_rec))
File "so.py", line 33, in normalized_rec
norm_rec = normalized_rec(new_rec)
File "so.py", line 8, in normalized_rec
jday = time.strftime('%j',time.strptime(' '.join(rec[4:6]+rec[7:8]),'%b %d %Y'))
File "/usr/lib64/python3.4/_strptime.py", line 501, in _strptime_time
tt = _strptime(data_string, format)[0]
File "/usr/lib64/python3.4/_strptime.py", line 344, in _strptime
(data_string, format))
ValueError: time data 'n' does not match format '%b %d %Y'
这很好地突出了问题:你写了normalized_rec
来操作记录列表,但你的递归调用给它一个记录, 不 在列表中:
norm_rec = normalized_rec(new_rec)
因此,当递归尝试处理更改的记录时,它从第一个元素开始,即字符串rchan
。
一个简单的解决方法是使递归在单个记录的列表上运行:
norm_rec = normalized_rec([new_rec])
现在重复所请求的次数,返回初始记录的版本列表,轻微处理:
RESULT: [
['rchan', 'pts/9', '10.40.91.236', 'Tue', 'Feb', '13', '16:53:42', '2018', '-', 'Tue', 'Feb', '13', '23:59:59', '2018', '(00:03)'],
['rchan', 'pts/9', '10.40.91.236', 'Wed', 'Feb', '14', '00:00:00', '2018', '-', 'Wed', 'Feb', '14', '23:59:59', '2018', '(00:03)'],
['rchan', 'pts/9', '10.40.91.236', 'Thu', 'Feb', '15', '00:00:00', '2018', '-', 'Tue', 'Feb', '15', '16:57:02', '2018', '(00:03)']]
我希望这会让你走向下一组问题。