Python:无法解析数据以将其转换为日期时间对象

时间:2018-08-16 08:16:03

标签: python

我有一个任务是从许多日志文件中提取特定时间的数据,这些日志文件是以下格式的文本文件:

Aug 15 17:32:57  sandbox_pre_process_config:[sandbox] Sandbox pre process
Aug 15 17:32:57  sandbox_list_destroy:[sandbox] sandbox_list_destroy, sandbox list destroy done
Aug 15 17:32:57  sandbox_list_create:[sandbox] sandbox_list_create, sandbox list create done
Aug 15 17:32:57  entering ext_mac_pre_process_config, init_done 1

我能够提取日期,但无法将其转换为我需要进一步操作的datetime对象。

这是我到目前为止尝试过的:

import subprocess
from datetime import datetime
import re

month_abbr = {"jan": 1, "feb": 2, "mar": 3, "apr": 4, "may": 5, "jun": 6,
              "jul": 7, "aug": 8, "sep": 9, "oct": 10, "nov": 11, "dec": 12}

def parse_date(lines):
    mon, day, tim = lines.split(None, 3)

    date_string = "{:02} {:02} ".format(month_abbr[mon.lower()], int(day)) + tim
    try:
        return datetime.strptime(date_string, "%m %d %H:%M:%S")
    except ValueError as e:
        return datetime.strptime(date_string, "%m %d %H:%M:%S.%f")

f = open("temp.txt")
for lines in f:
    line = lines.strip()
    date_obj = re.search('(.*?\d\d:\d\d:\d\d)', line)
    if date_obj:
        date = date_obj.group(1)
        val = parse_date(date)
        print val

这是我遇到的错误:

Aug 15 17:41:06

Aug 15 17:41:07

Aug 15 17:41:07

Traceback (most recent call last):
  File "main.py", line 23, in <module>
    val = parse_date(date)
  File "main.py", line 9, in parse_date
    mon, day, tim = lines.split(None, 3) # note the change
ValueError: too many values to unpack

我看不出有什么问题!请帮帮我!

P.S-只能使用标准python库!

3 个答案:

答案 0 :(得分:1)

考虑输入为 Aug 15 17:32:50 abc

lines.split(None, 3)将其分为4部分,而您仅分配了3个变量。

运行以下代码

import subprocess
from datetime import datetime
import re

month_abbr = {"jan": 1, "feb": 2, "mar": 3, "apr": 4, "may": 5, "jun": 6,
              "jul": 7, "aug": 8, "sep": 9, "oct": 10, "nov": 11, "dec": 12}

def parse_date(lines):
    mon, day, tim, _ = lines.split(None, 3) # note the change

    date_string = "{:02} {:02} ".format(month_abbr[mon.lower()], int(day)) + tim
    try:
        return datetime.strptime(date_string, "%m %d %H:%M:%S")
    except ValueError as e:
        return datetime.strptime(date_string, "%m %d %H:%M:%S.%f")

f = open("temp.txt")
for lines in f:
    line = lines.strip()
    date_obj = re.search('(.*?\d\d:\d\d:\d\d)', line)
    if date_obj:
        date = date_obj.group(1)
        if date:
            val = parse_date(date)
        else:
            continue
        print val

答案 1 :(得分:1)

这种方法应该有效:

from datetime import datetime        

with open("temp.txt") as f_input:
    for line in f_input:
        data = line.strip().split(' ', 3)
        date_string = ' '.join(data[:3])

        for date_format in ["%b %d %H:%M:%S", "%b %d %H:%M:%S.%f"]:
            try:
                dt = datetime.strptime(date_string, date_format)
                print dt, data[-1].strip()      # print date and log entry
            except ValueError as e:
                pass

它将前三个空格分开,为您提供日期和日志输入组件。然后,它将日期部分重新结合在一起,并应用两种可能的日期格式。如果正确解析了日期,则会显示该条目;否则,将跳过该行。

%b用于匹配3个字母的月份。

答案 2 :(得分:0)

我不太确定文本文件的外观如何,但是您收到的错误意味着字符串拆分器将日志字符串拆分为3个以上的部分(因为split方法的第二个参数被一个分开了-它将其分为4部分。

如果您不希望将时间后的文本分配给变量,则可以绕开前3个元素的拆分数目,并在stringplitter后面以slice索引作为lines.split(None,3)[ :3]。但是您必须确保日志中的每个字符串的构建方式都完全相同。