0

也许是一个奇怪的问题,但我们开始:

我必须解析几个日志文件,我正在以随机顺序读取这些文件。为了对它们进行排序,我需要按提取的日志时间进行排序。

日志条目将如下所示:

l = 2001:470:1f14:169:5000:eae0:589d:c211 - SOFT12 [14/Nov/2012:09:32:46 +0100] "POST /request HTTP/1.1" 200 984 "-" "-" 181446

我可以像这样提取日期:

l.split('+', 1)[0].split('-', 1)[1].split(' ')[2].split('[')[1]

这给了我:

14/Nov/2012:09:32:46

当我查看价值一年的日志文件时,每天有超过 200 万条记录,我不想将任何内容转换为日期时间对象,以便我可以切换格式和排序。所以我正在寻找一个纯字符串操作,它可以将字符串的日期部分14/Nov/2012转换为可排序的2012-11-14,最好是包含在我方便的拆分语句中...

问题:
如何修改字符串日期而不将其转换为日期时间对象?

4

2 回答 2

1

此代码将起作用:

# Converts something like "14/Nov/2012:09:32:46"
# to "2012-11-14:09:32:46"
_MONTHS = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
def convert(s):
  p = s.split(':', 1)
  t = p[0].split('/')
  return "%s-%02d-%02d:" % (t[2], _MONTHS.index(t[1]) + 1, int(t[0])) + p[1]
于 2013-03-08T14:41:32.817 回答
1

与其使用列表并使用其.index()方法,不如使用 dict 可能有用,因为列表将涉及线性搜索。即使列表很短,dict 中的散列操作也可能更快。至少值得一试。

因此,采用Nayuki Minase 的解决方案

# Converts something like "14/Nov/2012:09:32:46"
# to "2012-11-14:09:32:46"
_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
_MONTHS = dict((m, n + 1) for n, m in enumerate(_MONTHS)) # {"Jan": 1, "Feb: 2, ...} 
def convert(s):
  p = s.split(':', 1)
  t = p[0].split('/')
  return "%s-%02d-%02d:" % (t[2], _MONTHS[t[1]], int(t[0])) + p[1]

甚至(为了节省时间)

  return "%s-%02d-%s:" % (t[2], _MONTHS[t[1]], t[0]) + p[1]

如果您可以确定这一天已经具有正确的格式(前导 0)。

于 2013-03-08T14:52:15.060 回答