时间数据'n'与格式'%b%d%Y'错误

时间:2018-06-11 16:55:08

标签: python python-3.x centos

我创建了一个名为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'

我导入了所有模块

由于

1 个答案:

答案 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)']]

我希望这会让你走向下一组问题。