在Python中解析日志文件

3

我有一个日志文件,其中的行看起来像这样:

"1","2546857-23541","f_last","user","4:19 P.M.","11/02/2009","START","27","27","3","c2546857-23541",""

日志中的每一行都有12个双引号部分,字符串中的第7个双引号部分来自用户在聊天窗口中输入的内容:

"22","2546857-23541","f_last","john","4:38 P.M.","11/02/2009","
What's up","245","47","1","c2546857-23541",""

这段字符串展示了我遇到的问题;在聊天记录中,有些区域用户输入的文本是在日志文件中的新行上,而不是像第一个例子那样在同一行上。
因此,我希望第二个例子中的行看起来像第一个例子中的行。我尝试使用N++中的查找/替换功能,能够找到每个“孤立”的行,但我无法使其与上面的行连接起来。
然后我想编写一个Python文件来自动化这个过程,但我不知道如何编写代码。
运行unutbu的代码时,Python会出现错误。
"1760","4746880-00129","bwhiteside","tom","11:47 A.M.","12/10/2009","I do not see ^"refresh your knowledge
^" on the screen","422","0","0","c4746871-00128",""
3个回答

3

csv模块聪明地识别到当一个带引号的项目没有结束时(即必须包含一个换行符)。

import csv
with open('data.log',"r") as fin:
    with open('data2.log','w') as fout:        
        reader=csv.reader(fin,delimiter=',', quotechar='"', escapechar='^')
        writer=csv.writer(fout, delimiter=',', 
                          doublequote=False, quoting=csv.QUOTE_ALL)
        for row in reader:
            row[6]=row[6].replace('\n',' ')
            writer.writerow(row)

刚才看到了编辑。它能够工作,但是在文本日志中处理了大约1750行后会抛出“列表索引超出范围”的错误。我猜测这是因为原始文本文件有约352,000行,所以它已经耗尽了内存? - NewShinyCD
@NewShinyCD:嗯,我认为内存不应该是个问题,因为CSV读取器逐行遍历文件而不保存过去的行。如果您在代码行row[6]=row[6].replace('\n',' ')上收到IndexError: list index out of range错误,可能是数据文件中存在语法错误。如果您需要帮助,请发布回溯消息和日志文件中第1750行左右的文本。 - unutbu
我编辑了原始帖子,并标出了出现错误的那一行。我猜测这是因为开头的插入符号引起的? - NewShinyCD
@NewShinyCD:你说得对——插入符是问题的一部分。特别是,插入符后面的双引号需要被解释为一个字面上的双引号,而不是csv项的结尾。我们可以通过告诉csv.reader将插入符解释为转义字符来实现这一点(请参见编辑过的帖子)。 - unutbu

0
如果您的数据是有效的CSV格式,您可以使用Python的csv.reader类。它应该可以很好地处理您的示例数据。但是,根据源系统中嵌入的双引号的外观,它可能无法正确工作。请参见:http://docs.python.org/library/csv.html#module-contents

应该提到这个文件是一个 .txt 文件。 - NewShinyCD

0
除非我误解了问题。您只需要读取文件并删除在双引号字符之间出现的任何换行符即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接