python - 生成日志文件后如何将其写入CSV

标签 python

import random
import datetime

levels = ['CRITICAL','INFO','ERROR','WARNING','DEBUG']
module = ['web.py','setup.py','module.py','admin.py','views.py']
messages = ['email failed ','Info message','Warning message','Critical message']
dates = ['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 = levels[random.randint(0,len(levels)-1)]
    return x

def get_random_message():
    y = messages[random.randint(0,len(messages)-1)]
    return y

def get_random_module():
    z = module[random.randint(0,len(module))-1]
    return z

def generate_log_line():
    level = get_random_log_level()
    date =  dates[random.randint(0,len(dates))-1]
    dt = str(date)
    modulestr = get_random_module()
    msg = get_random_message()
    s = "{0} {1} {2} {3} \n".format(dt,level,modulestr,msg)
    return s

def create_log_file(filename=None):
    with open(filename,'w') as f:
        for x in range(5000):
            f.write(generate_log_line())
    return

if __name__ == '__main__':
    create_log_file('Test.txt')

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

2016-04-03 1:34:24.168122 DEBUG web.py email failed  
2016-04-17 08:04:24.978192 WARNING module.py Critical message   
2016-04-01 11:34:24.278122 DEBUG web.py email failed  
2016-04-23 04:44:43.472132 DEBUG setup.py Info message 
2016-04-23 04:44:43.472132 ERROR module.py email failed  
2016-04-23 04:44:43.472132 CRITICAL views.py email failed <br>

现在我想读取日志文件并将一些数据(例如dt,level,msg)解析为csv文件 下面是我的代码,但给出了错误:- 太多值需要解压,请帮忙?

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')

最佳答案

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

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

您正在分割日志行并希望将其放入 3 个变量中:

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

这是行不通的:它需要 3 个变量(因为这是你给它写入的变量),但它得到 4 个变量。你可以这样做

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

并且不要使用不需要的变量。

编辑:

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

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)

关于python - 生成日志文件后如何将其写入CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36976493/

相关文章:

python - WSGIPythonPath 不工作

Python:什么时候 0.0/0.0 =NaN 或 inf ,什么时候会给出异常?

python - 数据框条件过滤器长列表列

python - 在Python的Airflow中,如何在一定时间后停止任务运行?

javascript - 使用 Python 将 HTML/CSS/Javascript 文件转换为 PDF?

python - 从图像中重叠的字母中提取数据

python - 如何向包含数据的现有数组添加一层、一行和一列

python 3 try-除了所有错误

python - 如何在 django 中正确地从一个应用程序重定向到另一个应用程序

python - 在 matplotlib 中添加新的导航模式