Python数据库基本操作

最近有个项目由于版本原因使某些重要数据丢失、未存储到数据库中,需要从线上故障日志中统计这些数据,并将统计结果输出并补偿数据库。刚开始对python并不是很熟练,最先在服务器上采用grep|awk等命令获取想要的格式化数据文件后,由于数据冗余,所以手动采取措施显然不现实,因此想到用Java来读取文件并进行此数据操作,可代码写下来发现太繁杂了,不适合做日志数据处理。经Leader提醒,毅然决定采用python处理,代码写下来后,非常简洁,让我感受了python处理数据的高效性,本文贴上代码,也算是做一个小总结或尝试。

本次数据处理用到的python知识点有
1. Pandas结构化数据,并将数据分组、取最大值;
2. pymysql模块操作mysql数据库;
3. lambda函数表达式、map对iterables数据结构操作
备注:关于pandas的groupby和apply操作参考文章

# -*- coding: utf-8 -*-
"""
Created on Wed Apr  4 19:45:34 2018
pymysql处理mysql数据

"""
import pymysql as mysql
import pandas as pd

# 读取数据,用两个list存储从文件中读取的两列数据
userIds = []
times = []
with open('1.file/attend_fail_2018-03-23-18-59.log', 'r', encoding='utf-8') as fi:
    for line in fi.readlines():
        # 去除行字符串右边的空格
        if line.rstrip():
            temLineArray = line.split('     ')
            userIds.append(temLineArray[0].lstrip())
            times.append(temLineArray[1].lstrip())

# 将数据转换为DataFrame格式
attendPd = pd.DataFrame({
        'userTel': userIds,
        'attendTime': times
        })

# 取出每个userTel中的最大的attendTime值,并组成新的DataFrame
resultPd = attendPd.groupby('userTel').apply(lambda rowData : rowData[rowData.attendTime==rowData.attendTime.max()])
# 新建一列初始化值
resultPd['userId'] = 0

# 操作数据库
db_config = {
  'host': 'localhost',
  'port': 3306,
  'user': 'root',
  'passwd': 'root',
  'db' : 'test',
  'charset': 'utf8'}

conn = mysql.connect(**db_config)

# 获取游标操作,即数据库的指针
cur = conn.cursor()
userTels =', '.join(map(lambda x: "'%s'" % x, list(resultPd['userTel'])))
sql = " select a.employee_id, a.tel from t_test_info a where a.tel IN (%s)" % (userTels)
fo = open('1.file/result_2018_04_04.sql', 'w')
try:
    cur.execute(sql)
    resDb = cur.fetchall()
    for line in resDb:
        for index, row in resultPd.iterrows():
            if row['userTel'] == line[1]:
                # resultPd['userId'][index] = line[0]  # 修改DataFrame中'userId'的值
                #print("({}, {})".format(line[0], row['attendTime']))
                # 将计算结果写到文件中
                fo.write("({}, {}),\n".format(line[0], row['attendTime']))
    conn.commit()
except:
    import traceback
    traceback.print_exc()
    conn.rollback()
finally:
    cur.close()
    conn.close()
    fo.close()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值