首页 > 解决方案 > 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

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

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

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

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

PS - 只能使用标准 python 库!

标签: pythondatetime

解决方案


这种方法应该有效:

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

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

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


推荐阅读