解决不断更新的csv文件到Mysql数据库的转存,(解决Kiwi转存数据库问题)

解决不断更新的csv文件到Mysql数据库的转存,(解决Kiwi转存数据库问题)

不断更新的csv文件到Mysql数据库转存代码

先说核心思路: 由于csv文件是不断更新的所以我们要设置一个游标,在这里我利用了一个txt文件,第一次读取的时候进行检测,没有就创建一个新的txt文件,并将已读行数设置为0。之后在进行读取文件的时候利用pands的skiprows参数进行跳过。

//这里我们利用cl参数也就是记录的已读代码行数来传参数,表示跳过多少行。
        df = pd.read_csv(r'文件位置+文件名.csv', skiprows=int(cl),
                         header=None,
                         encoding='gb18030',error_bad_lines=False)

读取数据部分最底下有,在说一下游标的写入,也同样是个txt文本文件,这样能长久保存,每次写的时候选w参数这样能够直接覆盖掉之前的数据。
下面展示一些 内联代码片

file2 = open(r'文本文件', 'w')

当然我知道这样并不能完全实现自动化,所以还需要利用进程或线程来解决。

下面展示 全部代码

import pandas as pd
import datetime
import sqlalchemy


# 读取数据当前已经读了多少数据
def countline():
    # Python获取系统日期
    data = datetime.datetime.now()
    data = data.strftime('%Y-%m-%d')

    # 判断文件是否存在
    try:
        file1 = open(r'D:\graduation project\kiwisyslog\Syslogd\Logs\NewSyslogCatchAll-' + data + '-cl.txt', 'r')
        print("文件存在,不需要创建")
    except:
        print('文件不存在创建一个新的文件')
        file1 = open(r'D:\graduation project\kiwisyslog\Syslogd\Logs\NewSyslogCatchAll-' + data + '-cl.txt', 'w+')

    countline = str(file1.read())
    file1.close()
    if countline == '':
        countline = 0
    print(countline)
    return countline


# 读法有点粗暴,改用pands来读取数据
# with open('C:/Users/nuo/Desktop/shiyan/log/SyslogCatchAll-2022-10-24_1.csv')as f:
#     f_csv = csv.reader(f)
#     for row in f_csv:
#         print(row)

def cvs_to_mysql():
    # Python获取系统日期
    data = datetime.datetime.now()
    data = data.strftime('%Y-%m-%d')

    cl = countline()#获取当前已经读到的行数

    try:#这里加try是为了避免没有新的日志出现的时候报错,skiprows跳过全部行后报错。
        df = pd.read_csv(r'D:\graduation project\kiwisyslog\Syslogd\Logs\NewSyslogCatchAll-' + data + '.csv', skiprows=int(cl),
                         header=None,
                         encoding='gb18030',error_bad_lines=False)
        a = len(df)
        b = int(cl) + a
        writeline(b)
        print(cl)
        print(df)

        #con 参数为数据库的连接,这里不能用pymysql,pymysql只会傻傻 的一行一行写。可以用sqlalchemy,它能把一整个DataFrame一把梭哈掉。
        #if_exists 参数判断是否有重复表名,该参数有3个值:fail表示如果表名重复则不写入,replace表示如果表名重复覆盖原表,append表示追加写入。
        #engine = sqlalchemy.create_engine("mysql+pymysql://root:******@localhost:3306/数据库名?charset=utf8")
        # df.to_sql(name='表名', con=engine, if_exists='replace', index=True)

        engine = sqlalchemy.create_engine("mysql+pymysql://root:admin@localhost:3306/syslog?charset=utf8")
        df.columns = ['Date','Time','Priority','Hostname','MsgText']
        df.to_sql(name='syslogd6', con=engine, if_exists='append', index=False)

    except:
        print('当前日志已经全部被读取')



def writeline(countline):
    # Python获取系统日期
    data = datetime.datetime.now()
    data = data.strftime('%Y-%m-%d')
    file2 = open(r'D:\graduation project\kiwisyslog\Syslogd\Logs\NewSyslogCatchAll-' + data + '-cl.txt', 'w')

    file2.write(str(countline))
    file2.close()

cvs_to_mysql()

配置Kiwi(不用Kiwi的小伙伴可自行跳过)

本意是希望通过Kiwi直接将日志转存到数据库中,但是在和逗老师交流过程中发现该功能是付费功能,遂决定自己编写代码来实现该功能。
同时也解决了txt到数据库的转存问题。
逗老师原文链接: link

在setup中添加一个new action选择log to file ,我在这里把最后的文件后缀改成了.csv。这样就可以生成csv文件了,格式format部分可以自行设定或选择后面带csv的,这里我自己定义了一个。

这里我在Formatting里面的Custom file formats 添加了一个自己定义的format,大家可以自己按需选取想要的日志内容,Field delimiter记得选Comma Space。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值