python 从数据库中获得数据,并将关键的数写进数据库(案例)

本文介绍了一种使用Python实现的数据库操作方法,并详细解释了如何从数据库中获取ECG数据,对其进行解码和分析的过程。此外,还介绍了如何通过调用外部DLL来进一步分析这些数据,并将结果存回数据库。
import pymysql
import base64
from ctypes import *
import ctypes
import os
current_path = os.path.dirname(__file__)
from iholter_def_struc import ECGRTHead,StruEcgProperty

def init_database():
    try:

        conn = pymysql.connect(host='10.10.9.157', port=3306, user='chuanyhu', passwd='Chuanyhu@123',
                           db='yocaly_hcy_ecgtest', charset='gbk')
        cursor = conn.cursor()
        return conn,cursor
    except:
        print('Error:数据库连接失败')
        return None

'''查找需要的文件 database.execute('select *from temp_ecg_testdata where c_level = %s and c_dllLevel = %s ',['紧急','一般'])'''
def select_data(sql, *args):
    try:
        conn, cursor = init_database()
        cursor.execute(sql, args)
        datas =  cursor.fetchall()
        #print(datas)
        #print(len(datas))
        cursor.close()
        conn.close()
        return datas
    except:
        print("Error:数据查找错误")
        return None


'''将查询的数据进行解码'''
def decode_data(datas):
   try:
        deData = base64.b64decode(datas)
        return deData
   except:
        print("Error:解码失败")
        return None

'''创建数据库'''
def create_database(sql):

    try:
        conn, cursor = init_database()
        cursor.execute('drop table if EXISTS  ECG_RealAnalysisFile_compare')
        cursor.execute(sql)
        conn.close()
        return True
    except:
        print('Error:创建数据库失败')
        return None

'''向数据库中插入数据'''
def insert_database(sql,*args):
    conn, cursor = init_database()
    try:
        cursor.execute(sql,args)
        conn.commit()
        cursor.close()
        conn.close()
        return True
    except:
        print("Error:数据插入失败")
        return None
'''读取数据'''
def read_data(deData):
    try:
        struct_prop = read_rt_head(deData[0:180])
        ecg_lead_s_datas= read_rt_body_data(deData[180:],struct_prop)
        return struct_prop,ecg_lead_s_datas
    except:
        print("Error:数据读取出错1")
def read_rt_head(head_buf):
    rt_head = ECGRTHead(head_buf)
    ecg_prop = rt_head.get_ecg_property()
    struct_prop = StruEcgProperty(ecg_prop.get_sample_rate(),4,ecg_prop.get_data_length(),len(rt_head.get_lead_names()),rt_head.get_lead_names())
    return struct_prop

def read_rt_body_data(body_buf,struct_prop):

    ecg_leads_datas = []
    for ind in range(struct_prop.get_data_channel_num()):
        ecg_leads_datas.append([])


    piece_count = len(body_buf)//struct_prop.get_piece_len()
    for piece_ind in range(piece_count):
        start_ind = piece_ind * struct_prop.get_piece_len() + struct_prop.get_piece_head_len()
        end_ind = (piece_ind+1)*struct_prop.get_piece_len()

        lead_num = struct_prop.get_data_channel_num()
        data_len = struct_prop.get_data_len()
        ch_precision = int(struct_prop.get_data_precision())
        lead_data_len = data_len//lead_num//ch_precision
        for ind in range(lead_data_len):
            for lead_ind in range(lead_num):
                ch_data = read_transformed_chdata(body_buf[start_ind+(ind*lead_num+lead_ind)*ch_precision:start_ind+(ind*lead_num+lead_ind+1)*ch_precision],ch_precision,struct_prop,True)
                ecg_leads_datas[lead_ind].append(ch_data)
        return ecg_leads_datas

def read_transformed_chdata(byte_data,ch_size,ecg_struct_prop,is_read_origin= False):
    if ch_size == 1:
        if is_read_origin:
            return byte_data[0]
        value = byte_data[0] - 128
        value = value/ecg_struct_prop.get_max_value() * ecg_struct_prop.get_real_input_max_value() *0.01
        return value
    elif ch_size == 2:
        value = ctypes.c_int16(byte_data[0] | byte_data[1]<<8).value
        if is_read_origin:
            return value
        value = value/ecg_struct_prop.get_max_value() * ecg_struct_prop.get_real_input_max_value() *0.01
        return value


if __name__ == '__main__':

    '''创建数据表'''
    sql_creat = 'create table ECG_RealAnalysisFile_compare(c_servicecode char(100),noiseLeve char(100), typeBeatClass char(100))'
    create_database(sql_creat)

    '''查询数据库'''
    sql_select = 'select * from temp_ecg_testdata '#where c_level = %s and c_dllLevel = %s'
    #datas = select_data(sql_select,'次紧急','一般')  #'一般','一般'  '次紧急','一般' '普通报警','一般' '紧急','一般'
    datas = select_data(sql_select)
    #print(len(datas))
    '''调用dll'''
    dll = ctypes.cdll.LoadLibrary('G:/python/mydll/EcgMonitorRealAnalysis.dll')

    '''将获得的多个元组解码放入数据库中,进行数据插入操作'''
    #i = 0
    for row_data in datas:

        #每行的序号
        code_servicecode = row_data[0]
        data = row_data[1]

        #解析64数据
        missing_data = 4- len(data)%4
        if missing_data:
            data +=b'='*missing_data
        de_data =decode_data(data)
        print(len(de_data))
        #读取数据
        #i = i + 1
        # if i == 175:
        #     print('error')
        struct_prop, ecg_lead_s_datas = read_data(de_data)

        if ecg_lead_s_datas == None or ecg_lead_s_datas[0] == None:
            continue
            # print("============")
            # print(i)

        c_ecg_lead0_datas = (ctypes.c_int * len(ecg_lead_s_datas[0]))()
        c_ecg_lead1_datas = (ctypes.c_int * len(ecg_lead_s_datas[1]))()
        c_ecg_lead2_datas = (ctypes.c_int * len(ecg_lead_s_datas[2]))()
        c_ecg_lead3_datas = (ctypes.c_int * len(ecg_lead_s_datas[3]))()
        c_ecg_lead0_datas[:] = ecg_lead_s_datas[0][:]
        c_ecg_lead1_datas[:] = ecg_lead_s_datas[1][:]
        c_ecg_lead2_datas[:] = ecg_lead_s_datas[2][:]
        c_ecg_lead3_datas[:] = ecg_lead_s_datas[3][:]

        c_lead_data_addr = (ctypes.c_void_p*4)()
        c_lead_data_addr[0] = ctypes.addressof(c_ecg_lead0_datas)
        c_lead_data_addr[1] = ctypes.addressof(c_ecg_lead1_datas)
        c_lead_data_addr[2] = ctypes.addressof(c_ecg_lead2_datas)
        c_lead_data_addr[3] = ctypes.addressof(c_ecg_lead3_datas)

        #调用dll进行分析
        #数据的采样频率
        Fs = struct_prop.get_sample_rate()
        noiseLeve = []
        typeBeatClass = []
        #4个导联
        for ind in range(4):
            noise_level = ctypes.c_int()
            typeBeat = ctypes.c_int()
            noise_adr = ctypes.addressof(noise_level)
            typeB_adr = ctypes.addressof(typeBeat)
            numR = dll.ECG_RealAnalysisFile(c_lead_data_addr, len(c_ecg_lead0_datas),ind,Fs,noise_adr,typeB_adr)
            noiseLeve.append(noise_level)
            typeBeatClass.append(typeBeat)
       # print(noiseLeve)
       # print(typeBeatClass)
        #将这条数据的id,noise_level typeBeatClass写进数据库中
        noiseLeves = str(noiseLeve)
        typeBeatClasss = str(typeBeatClass)
        sql_insert = 'insert into ECG_RealAnalysisFile_compare(c_servicecode,noiseLeve,typeBeatClass) values(%s,%s,%s)'
        insert_database(sql_insert,code_servicecode,noiseLeves,typeBeatClasss)





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野狼位位

给点辛苦费0.1元

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值