在Python中组合日志文件和按时间排序

时间:2015-08-10 19:02:10

标签: python sorting file-io

首先,我对Python和编程非常陌生,所以如果这是一个非常明显的问题,请耐心等待。

我有一个未定义的数量(可能超过10个)的日志文件与目录中的其他随机文件混合在一起,我需要将这些文件合并到一个文件中,其中的行按每行开头的时间戳排序。日志文件是.txt,并且在同一目录中还有其他非日志.txt文件,所以我只是让这个脚本的用户输入每个日志文件作为参数。

现在,在您将此标记为重复之前,我在此处查看了4页搜索结果,并且的问题都有我可以使用的答案。

到目前为止,我有以下几种可用的Python代码:

log_file_name = 'logfile.txt'

import sys
import fileinput
from Tkinter import Tk
from tkFileDialog import askopenfilenames

logfile = open(log_file_name, 'w+')
logfile.truncate()
logfile.seek(0)

# get list of file names
print "Opening File Dialog"
Tk().withdraw()
files = askopenfilenames(title='Select all logs you would like to compile.')

for index in range(len(files)):
    print "Loop ", index
    print "--- Debug message: Reading a file... ---"
    logdata = open((files[index])).readlines()
    print "--- Debug message: Finished reading. Writing a file... ---"
    # turns logdata into a string and writes it to logfile
    logfile.write(''.join(logdata))
    logfile.write("\n")

print ""
print "Exited for loop."
logfile.close()

上面的代码将您选择的所有文件的内容放入一个文本文件中,但它并没有对它们进行排序。

我正在考虑使用正则表达式来搜索括号内的数字,然后根据它对每一行进行排序......?

以下是一些示例日志文件内容。

[xx.xxxxxx] [Text] Text : Text: xxx
[xx.xxxxxx] [Text] Text : Text: xxx
[xx.xxxxxx] [Text] Some text.
There could be multiple lines of text here
These lines could include [brackets.] :(

[xx.xxxxxx] [Text] Text : Text: xxx

[xx.xxxxxx]是自系统启动以来的秒数时间戳。

2 个答案:

答案 0 :(得分:0)

由于时间戳位于每条记录的开头,因此您可以进行排序。如果花费的时间太长,那么您可能希望在输入中对每个日志文件进行排序并合并到最终列表中

import pprint

file_1="""[92.5] Text Text : Text: xxx
[91.5] Text Text : Text: xxx"""

file_2="""[91.7] [Text] Some text.
Some text of variable size, may be on multiple lines. Number of lines is variable also. 
[90.5] [Text] Some text.
Some text of variable size, may be on multiple lines. Number of lines is variable also."""

## Write data to some test log files
with open("./log_1.txt", "w") as fp_out:
    fp_out.write(file_1)
with open("./log_2.txt", "w") as fp_out:
    fp_out.write(file_2)

def input_recs(f_name):
    recs=open(f_name, "r").readlines()
    ## assume you want to omit text only lines
    return_list=[rec.strip() for rec in recs if rec[1].isdigit()]
    return return_list

sorted_list=[]
for f_name in ["log_1.txt", "log_2.txt"]:
    recs=input_recs(f_name)
    sorted_list.extend(recs)

sorted_list.sort()
pprint.pprint(sorted_list)

答案 1 :(得分:0)

如果你没有得到好的答案,那就意味着你不会提出好的问题。什么"识别每条消息,然后对消息进行排序,而不是每一行"意思。为了说明如何一般地执行此操作,我将假设您希望没有时间戳的行包含在上一个时间戳中。您必须以某种顺序获取数据,这些顺序可以在某些rec(ord)s上排序。使用字典或列表列表有两种方法可以做到这一点。以下使用列表列表并简单地将非时间戳rec(ord)s附加到上一个时间戳rec,以便所有记录以时间戳开头,并且可以对列表进行排序。到现在为止,您应该了解所涉及的一般原则。

file_1="""[92.5] [Text1[ Text : Text: xxx
[91.5] [Text2[ Text : Text: xxx
[92.5] [Text2.5] Some text.
[90.5] [Text3] Some text"""

file_2="""[91.7] [Text4] Some text.
Some text of variable size, may be on multiple lines. Number of lines is variable also. 
[90.5] [Text5] Some text.
Some text of variable size, may be on multiple lines. Number of lines is variable also."""

## Write data to some test log files
with open("./log_1.txt", "w") as fp_out:
    fp_out.write(file_1)
with open("./log_2.txt", "w") as fp_out:
    fp_out.write(file_2)

def input_recs(f_name):
    return_list=[]
    append_rec=""
    with open(f_name, "r")as fp_in:
        for rec in fp_in:
            if rec[1].isdigit():
                ## next time stamp so add append_rec to return_list and
                ## create a new append_rec that contains this record
                if len(append_rec): 
                    return_list.append(append_rec)
                append_rec=rec
            else:
                append_rec += rec  ## not a time stamp

    ## add last rec
    if len(append_rec): 
        return_list.append(append_rec)

    return return_list

sorted_list=[]
for f_name in ["log_1.txt", "log_2.txt"]:
    recs_list=input_recs(f_name)
    sorted_list.extend(recs_list)

sorted_list.sort()
import pprint
pprint.pprint(sorted_list)  ## newlines are retained