Python 生成日志文件后,如何将其写入CSV

Python 生成日志文件后,如何将其写入CSV,python,Python,上述代码使用以下格式生成日志文件:- 您正在日志行上写入4个元素: import csv import itertools import generate_logs def read_log_file_to_csv(filename=None): with open('logs.csv','w') as csv: csv.write("Date, Levels, Message") with open(filename,'r') as f: fo

上述代码使用以下格式生成日志文件:-


您正在日志行上写入4个元素:

import csv
import itertools
import generate_logs

def read_log_file_to_csv(filename=None):
    with open('logs.csv','w') as csv:
        csv.write("Date, Levels, Message")
    with open(filename,'r') as f:
        for line in f.readlines():
            dt,level,msg = parse_log_file(line)
            csv.write("{0} {1} {2}".format(dt,level,msg))

def parse_log_file(line):  
    dt,level,msg = line.split("\t")
    return dt,level,msg

if __name__ == '__main__':
    read_log_file_to_csv('Test.txt')
您正在拆分日志行,并希望将其放入3个变量中:

s = "{0} {1} {2} {3} \n".format(dt,level,modulestr,msg)
这是行不通的:它需要3个变量(因为这是你给它写的)然后得到4个。你能行

dt,level,msg = line.split("\t")
不要使用你不需要的变量

编辑:

如果要在选项卡上拆分行,则必须确保它有一些选项卡。所以改变

dt,level,modulestr,msg = line.split("\t")


我修改了您的解析函数以满足您的需要。有几件事值得一提。第一个是
split
。它将字符串拆分为多个部分(如错误消息所示)。第二个是函数
read_log_file_to_csv
的缩进,它打开一个文件(带有语句)并将其关闭。下面是一个完整的日志生成和解析示例:

#/usr/bin/env python
#-*-编码:utf-8-*-
随机输入
级别=[“关键”、“信息”、“错误”、“警告”、“调试”]
module=['web.py','setup.py','module.py','admin.py','views.py']
messages=['email failed'、'Info message'、'Warning message'、'Critical message']
日期=['2016-04-01 11:34:24.278122','2016-04-03 1:34:24.168122','2016-04-11 12:34:24.278002','2016-04-17 08:04:24.978192','2016-04-23 04:44:43.472132']
def get_random_log_level():
x=级别[random.randint(0,len(级别)-1)]
返回x
def get_random_消息():
y=消息[random.randint(0,len(消息)-1)]
返回y
def get_random_模块():
z=模[random.randint(0,len(模))-1]
返回z
def生成日志行():
级别=获取\u随机\u日志\u级别()
日期=日期[random.randint(0,len(日期))-1]
dt=str(日期)
modulestr=get_random_module()
msg=获取随机消息()
s=“{0}{1}{2}{3}\n”。格式(dt、level、modulestr、msg)
返回s
def创建日志文件(文件名=无):
将open(filename,'w')作为f:
对于范围(5000)内的x:
f、 写入(生成日志行())
返回
def read_log_file_to_csv(文件名=无):
打开('logs.csv','w')作为csv:
csv.write(“日期、级别、消息\n”)
将open(filename,'r')作为f:
对于f.readlines()中的行:
dt,level,msg=parse_log_文件(行)
write(“{0},{1},{2}”。格式(dt,level,msg))
def解析日志文件(第行):
行=行。拆分(“”)
dt=”“.连接(第[:2]行)
标高=直线[2:3]
msg=”“.join(第[3:]行)
返回dt、level、msg
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
创建日志文件('Test.txt')
将日志文件读取到csv('Test.txt')
输出:

s = "{0}\t{1}\t{2}\t{3}\n".format(dt,level,modulestr,msg)

你应该考虑使用

,你可以继续这样做,因为只有最后一个字段可以包含空格,但是用法是在任何字段中都不能包含分隔符。 通过使用split的第二个参数,您可以将
parse_log_file
函数更改为:

Date, Levels, Message
2016-04-11 12:34:24.278002, ['WARNING'], setup.py Info message 
2016-04-11 12:34:24.278002, ['ERROR'], module.py Warning message 
2016-04-01 11:34:24.278122, ['ERROR'], views.py email failed  
2016-04-23 04:44:43.472132, ['ERROR'], web.py Critical message 
2016-04-23 04:44:43.472132, ['DEBUG'], module.py Critical message 
2016-04-01 11:34:24.278122, ['WARNING'], views.py email failed  
2016-04-01 11:34:24.278122, ['DEBUG'], views.py email failed  
2016-04-11 12:34:24.278002, ['ERROR'], module.py Info message 
2016-04-23 04:44:43.472132, ['INFO'], views.py email failed 
...

文件不是用制表符
\t
分隔的,而是用空格分隔的,至少这是您在第一段代码中编写的内容。您还可以写入四个值,并尝试只读取三个值。这不匹配。请注意,该文件使用空格``作为分隔符,而不是选项卡
\t
。我根据您的建议更改了代码,但得到了值错误:关闭文件上的I/O操作我添加了一个完整的示例,其中包含日志生成和ParsingHanks@Salomonderosi。我已经运行了您的代码,但在csv中,级别和消息列中没有数据。日期也没有以正确的格式显示。
s = "{0} {1} {2} {3} \n".format(dt,level,modulestr,msg)
s = "{0}\t{1}\t{2}\t{3}\n".format(dt,level,modulestr,msg)
Date, Levels, Message
2016-04-11 12:34:24.278002, ['WARNING'], setup.py Info message 
2016-04-11 12:34:24.278002, ['ERROR'], module.py Warning message 
2016-04-01 11:34:24.278122, ['ERROR'], views.py email failed  
2016-04-23 04:44:43.472132, ['ERROR'], web.py Critical message 
2016-04-23 04:44:43.472132, ['DEBUG'], module.py Critical message 
2016-04-01 11:34:24.278122, ['WARNING'], views.py email failed  
2016-04-01 11:34:24.278122, ['DEBUG'], views.py email failed  
2016-04-11 12:34:24.278002, ['ERROR'], module.py Info message 
2016-04-23 04:44:43.472132, ['INFO'], views.py email failed 
...
def parse_log_file(line):  
    dt,level,msg = line.split(" ", 2)  # split on first 2 spaces
    return dt,level,msg