windows下,python3读写windows Access数据库

一、知识点

mdb,是旧版windows Access数据库的格式。

accdb,是现行的windows Access数据库的格式。

二者兼容,可以通过重命名的方法进行格式转换。

二、确定要读取的数据库,要写的数据库

要写的数据库需提前创建好。

三、代码示例

主代码:

convert_QB_LINE_POINTS.py

'''
知识点:
起点高程 =  起点地面高程
终点高程 =  终点地面高程
起始管顶高程 = 起始点高程 - 起始点埋深
终止管顶高程 = 终止点高程 - 终止点埋深
井底高程 = 地面高程 - 井底埋深
'''
import pypyodbc
from func7 import *
#### filepath是变量,access文件的绝对路径。注意:*.accdb一定要加上
# filepath1绑定原数据路径。
filepath1 = r"C:\Users\RH-AS03\Desktop\东延路补\杨成庄\杨成庄.MDB"
conn1 = pypyodbc.connect(u'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + filepath1)
cur1 = conn1.cursor()
# filepath3绑定原数据转换后,目标数据库的路径。
filepath3 = r"C:\Users\RH-AS03\Desktop\东延路补\杨成庄\杨成庄2.mdb"
conn3 = pypyodbc.connect(u'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + filepath3)
#### filepath是变量,access文件的绝对路径。注意:*.accdb一定要加上
cur3 = conn3.cursor()

# tablelist1存放大邱庄长江路.mdb数据库中所有的表.
tablelist1 = [
    'DX_LINE','GD_LINE','LD_LINE','RS_LINE',
    'SP_LINE','TR_LINE','WS_LINE','YS_LINE',
    'DX_POINT','GD_POINT','LD_POINT','RS_POINT',
    'SP_POINT','TR_POINT','WS_POINT','YS_POINT'
]
# print(tablelist1)
for table in tablelist1:
    if table in [
        'BM_LINE','DX_LINE','EX_LINE','GD_LINE','JK_LINE','LD_LINE','RS_LINE',
        'SP_LINE','SY_LINE','TR_LINE','WS_LINE','XH_LINE','YS_LINE','ZQ_LINE']:
        print(table)
        # 以下要处理所有的管线表.        
        handleLineTable(table)
    elif table in [
        'BM_POINT','DX_POINT','EX_POINT','GD_POINT','JK_POINT','LD_POINT','RS_POINT',
        'SP_POINT','SY_POINT','TR_POINT','WS_POINT','XH_POINT','YS_POINT','ZQ_POINT']:
        print(table)
        # 以下要处理所有的管点表.
        handlePointTable(table)
Ltables = ["不明管线","电力管线","电力通讯管线","电信管线","给水管线",
"监控管线","排水管线","燃气管线",'热力管线','信号管线']
# Ltitle = "起始点号,终止点号,起始埋深,终止埋深,起始管顶高程,终止管顶高程,起始管底高程,终止管底高程,管线材料,埋设方式,管径,建设日期,权属单位,电缆条数,光缆条数,压力值,总孔数,已用孔数,勘测单位,管线亚级类别,管线使用状况,线标准代码,流向,备注"
Ptables = ["不明管点","电力管点","电力通讯管点","电信管点","给水管点",
"监控管点","排水管点","燃气管点",'热力管点','信号管点']
# Ptitle = "物探点号,X,Y,地面高程,特征,附属物,井底高程,井底埋深,点标准代码,图幅号,勘测单位,权属单位,建设日期,数据类型,精度级别,偏心井位,备注"
# 以下处理Ptables的 物探点号
handlePointNum(Ptables)
# 以下处理Ltables的 起始点号,终止点号
handleLineNum(Ltables)
# 提交到数据库
conn3.commit()
# 关闭数据库连接
conn1.close()
conn3.close()

定义函数模块:

func7.py

import pypyodbc
filepath1 = r"C:\Users\RH-AS03\Desktop\东延路补\杨成庄\杨成庄.MDB"
conn1 = pypyodbc.connect(u'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + filepath1)
#### filepath是变量,access文件的绝对路径。注意:*.accdb一定要加上
cur1 = conn1.cursor()
filepath3 = r"C:\Users\RH-AS03\Desktop\东延路补\杨成庄\杨成庄2.mdb"
conn3 = pypyodbc.connect(u'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + filepath3)
## filepath是变量,access文件的绝对路径。注意:*.accdb一定要加上
cur3 = conn3.cursor()

# 此函数用于预处理查询数据,及插入数据到相应的管线表。
def handleSelectDataL(datas, sql):
    for d in datas:
        e = []
        for x in d:
            if x:
                e.append(x)
            else:
                e.append('')
        if e[-9] == '':
            e[-9] = 0
        if e[-10] == '':
            e[-10] = 0
        if e[-12] == '':
            e[-12] = 0
        if e[-1] == '':
            e[-1] = 0
        if e[-2] == '':
            e[-2] = 0
        if e[-3] == '':
            e[-3] = 0
        # print(tuple(e))
        sql2 = sql + str(tuple(e))
        cur3.execute(sql2)
        conn3.commit()

# 此函数用于处理所有的管线表.
def handleLineTable(table):    
    # 定义查询语句
    cur1.execute('select 终点点号,材质,埋设方式,管径,权属单位,条数,压力值,\
        总孔数,已用孔数,勘测单位,使用状况,流向,备注,起点点号,起点埋深,\
        终点埋深,建设日期 from ' + table)    
    # 这种可以全部导入
    datas1 = cur1.fetchall()    
    # 电信管线插入光缆条数,
    # 电力管线插入电缆条数,否则,不插入条数.
    if table in ['DX_LINE']:        
        sql = "insert into 电信管线(终止点号,管线材料,埋设方式,管径,权属单位,\
            光缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,流向,备注,\
            起始点号,起始埋深,终止埋深,建设日期) values"
        handleSelectDataL(datas1, sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        Ttable = '电信管线'
        calGaocheng(table, Ttable)        
        # 定义需额外处理字段sql语句.
        sql = "update 电信管线 set 电缆条数 = 0, 起始管底高程 = 0.00,\
        终止管底高程 = 0.00,管线亚级类别='电信'"
        cur3.execute(sql)
        # sql = "update 电信管线 set 管线亚级类别='监控' where 起始点号 like 'JK%'"
        # cur3.execute(sql)            
    elif table in ['GD_LINE', 'LD_LINE']:
        sql = 'insert into 电力管线(终止点号,管线材料,埋设方式,管径,权属单位,\
        电缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,流向,备注,\
        起始点号,起始埋深,终止埋深,建设日期) values'
        handleSelectDataL(datas1, sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        Ttable = '电力管线'
        calGaocheng(table, Ttable)        
        # 定义需额外处理字段sql语句.
        if table == 'GD_LINE':
            sql = "update 电力管线 set 光缆条数=0, 起始管底高程 = 0.00,\
            终止管底高程 = 0.00,管线亚级类别='供电' where 起始点号 like '%%GD%'"
        else:
            sql = "update 电力管线 set 光缆条数=0, 起始管底高程 = 0.00,\
            终止管底高程 = 0.00,管线亚级类别='路灯' where 起始点号 like '%%LD%'"
        cur3.execute(sql)
    elif table in ['RS_LINE','ZQ_LINE']:
        sql = 'insert into 热力管线(终止点号,管线材料,埋设方式,管径,\
        权属单位,电缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,\
        流向,备注,起始点号,起始埋深,终止埋深,建设日期) values'
        handleSelectDataL(datas1, sql)
        sql = "update 热力管线 set 光缆条数=0,管线亚级类别='热水',\
            起始管底高程=0.00,终止管底高程=0.00"
        cur3.execute(sql)
        sql = "update 热力管线 set 管线亚级类别='蒸汽' where 起始点号 like 'ZQ%'"
        cur3.execute(sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        Ttable = '热力管线'
        calGaocheng(table, Ttable)            
    elif table in ['SP_LINE','SY_LINE']:
        sql = 'insert into 给水管线(终止点号,管线材料,埋设方式,管径,\
        权属单位,电缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,\
        流向,备注,起始点号,起始埋深,终止埋深,建设日期) values'
        handleSelectDataL(datas1, sql)
        sql = "update 给水管线 set 光缆条数=0,管线亚级类别='输配水管',\
                起始管底高程=0.00,终止管底高程=0.00"
        cur3.execute(sql)
        sql = "update 给水管线 set 管线亚级类别='水源管'\
                where 起始点号 like '%%SY%'"
        cur3.execute(sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        Ttable = '给水管线'
        calGaocheng(table, Ttable)            
    elif table in ['TR_LINE']:
        sql = 'insert into 燃气管线(终止点号,管线材料,埋设方式,管径,\
        权属单位,电缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,\
        流向,备注,起始点号,起始埋深,终止埋深,建设日期) values'
        handleSelectDataL(datas1, sql)
        # 定义需额外处理字段sql语句.
        sql = "update 燃气管线 set 光缆条数=0,管线亚级类别='天然气',\
        起始管底高程=0.00,终止管底高程=0.00"
        cur3.execute(sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        # start_gao,end_gao,存放(起始管顶高程,终止管顶高程)
        Ttable = '燃气管线'
        calGaocheng(table, Ttable)            
    elif table in ['WS_LINE', 'YS_LINE']:
        sql = 'insert into 排水管线(终止点号,管线材料,埋设方式,管径,权属单位,\
        电缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,流向,备注,\
        起始点号,起始埋深,终止埋深,建设日期) values'
        handleSelectDataL(datas1, sql)
        # 定义需额外处理字段sql语句.
        if table == 'WS_LINE':
            sql = "update 排水管线 set 光缆条数=0,管线亚级类别='污水',\
            起始管顶高程=0.00,终止管顶高程=0.00 where 起始点号 like '%%WS%'"
        else:
            sql = "update 排水管线 set 光缆条数=0,管线亚级类别='雨水',\
            起始管顶高程=0.00,终止管顶高程=0.00 where 起始点号 like '%%YS%'"
        cur3.execute(sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        # start_gao, end_gao,分别存放(起始管顶/底高程,终止管顶/底高程)
        Ttable = '排水管线'
        calGaocheng(table, Ttable)            
    elif table in ['BM_LINE']:
        sql = 'insert into 不明管线(终止点号,管线材料,埋设方式,管径,权属单位,\
        电缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,流向,备注,\
        起始点号,起始埋深,终止埋深,建设日期) values'
        handleSelectDataL(datas1, sql)
        # 定义需额外处理字段sql语句.
        sql = "update 不明管线 set 光缆条数=0, 起始管底高程 = 0.00,\
        终止管底高程 = 0.00,管线亚级类别='不明'"
        cur3.execute(sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        # start_gao, end_gao,分别存放(起始管顶/底高程,终止管顶/底高程)
        Ttable = '不明管线'
        calGaocheng(table, Ttable)
    elif table in ['JK_LINE']:
        sql = "insert into 监控管线(终止点号,管线材料,埋设方式,管径,权属单位,\
            光缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,流向,备注,\
            起始点号,起始埋深,终止埋深,建设日期) values"
        handleSelectDataL(datas1, sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        Ttable = '监控管线'
        calGaocheng(table, Ttable)        
        # 定义需额外处理字段sql语句.
        sql = "update 监控管线 set 电缆条数 = 0, 起始管底高程 = 0.00,\
        终止管底高程 = 0.00,管线亚级类别='监控'"
        cur3.execute(sql)
    elif table in ['XH_LINE']:
        sql = "insert into 信号管线(终止点号,管线材料,埋设方式,管径,权属单位,\
            光缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,流向,备注,\
            起始点号,起始埋深,终止埋深,建设日期) values"
        handleSelectDataL(datas1, sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        Ttable = '信号管线'
        calGaocheng(table, Ttable)        
        # 定义需额外处理字段sql语句.
        sql = "update 信号管线 set 电缆条数 = 0, 起始管底高程 = 0.00,\
        终止管底高程 = 0.00,管线亚级类别='信号'"
        cur3.execute(sql)
    elif table in ['EX_LINE']:
        sql = "insert into 电力通讯管线(终止点号,管线材料,埋设方式,管径,权属单位,\
            电缆条数,压力值,总孔数,已用孔数,勘测单位,管线使用状况,流向,备注,\
            起始点号,起始埋深,终止埋深,建设日期) values"
        handleSelectDataL(datas1, sql)
        # 以下要计算相应的目标数据 高程,并插入到相应的表中.
        Ttable = '电力通讯管线'
        calGaocheng(table, Ttable)        
        # 定义需额外处理字段sql语句.
        sql = "update 电力通讯管线 set 光缆条数=0, 起始管底高程 = 0.00,\
        终止管底高程 = 0.00,管线亚级类别='电力通讯'"
        cur3.execute(sql)
    # 以下要处理线标准代码.
    handleLineCode(table)

# 此函数用以计算相应管线表的相应的高程.
def calGaocheng(Otable, Ttable):
    # 定义查询语句, 从对应的POINT中去查 管点编号 和 地面高程.
    # 地面高程,即相应的起点/终点高程.
    cur1.execute('select 管点编号, 地面高程 from ' + Otable[:3] + "POINT")
    datas3 = cur1.fetchall()
    # print(datas3)
    # 定义查询语句, 从table中去查 起点点号,终点点号,起点埋深,终点埋深.
    cur1.execute('select 起点点号, 终点点号, 起点埋深, 终点埋深 from ' + Otable)
    datas4 = cur1.fetchall()
    # print(datas)
    # start,存放所有的(起点点号,起点埋深).
    # end,存放所有的(终点点号,终点埋深).
    # 这两个列表存放的点号,相互之间有重复.自己内部没有重复.
    start = []
    end = []
    for data in datas4:
        start.append((data[0], data[2]))
        end.append((data[1], data[3]))    
    # 以下求所有的起始管顶高程,终止管顶高程,分别放在start_gao,end_gao里.
    start_gao = []
    end_gao = []
    for x in start:
        for y in datas3:
            if y[0] == x[0]:
                # print(y[1],x[1])
                if y[1] and x[1]:
                    start_gao.append((y[0], str(round(y[1] - x[1], 2))))
                    break
                else:
                    start_gao.append((y[0], '0.00'))
                    break
    for x in end:
        for y in datas3:
            if y[0] == x[0]:
                if y[1] and x[1]:
                    end_gao.append((y[0], str(round(y[1] - x[1], 2))))
                    break
                else:
                    end_gao.append((y[0], '0.00'))
                    break
    if Otable in ['WS_LINE', 'YS_LINE']:
        for s in start_gao:
                t = addQuotes(s[0])
                sql = "update " + Ttable + " set 起始管底高程 =" + s[1] + " where 起始点号=" + t
                cur3.execute(sql)
        for e in end_gao:
            t = addQuotes(e[0])
            sql = "update " + Ttable + " set 终止管底高程 =" + e[1] + " where 终止点号=" + t
            cur3.execute(sql)
    else:
        for s in start_gao:
            # t = s[0]
            t = addQuotes(s[0])
            # print(s[1],type(s[1]))
            # print(t,type(t))
            sql = "update " + Ttable + " set 起始管顶高程 = " + s[1] + "  where 起始点号 = " + t
            # print(addQuotes(sql))
            cur3.execute(sql)
        for e in end_gao:
            t = addQuotes(e[0])
            sql = "update " + Ttable + " set 终止管顶高程 =" + e[1] + " where 终止点号=" + t
            cur3.execute(sql)

# 此函数用于处理线标准代码.
def handleLineCode(table):
    if table in ['DX_LINE']:        
        sql = "update 电信管线 set 线标准代码=1020002"
        cur3.execute(sql)        
    elif table in ['GD_LINE', 'LD_LINE']:                
        if table == 'GD_LINE':
            sql = "update 电力管线 set 线标准代码=1011082 where 管线亚级类别='供电' and 压力值='10kV'"
            cur3.execute(sql)
            sql = "update 电力管线 set 线标准代码=1011072 where 管线亚级类别='供电' and 压力值='35kV'"
            cur3.execute(sql)
            sql = "update 电力管线 set 线标准代码=1011092 where 管线亚级类别='供电' and 压力值='0.38kV'"
            cur3.execute(sql)
            sql = "update 电力管线 set 线标准代码=1011002 where 管线亚级类别='供电' and 压力值=''"
            cur3.execute(sql)
        else:
            sql = "update 电力管线 set 线标准代码=1012002 where 管线亚级类别='路灯'"
            cur3.execute(sql)        
    elif table in ['RS_LINE']:        
        sql = "update 热力管线 set 线标准代码=1061002"
        cur3.execute(sql)
    elif table in ['SP_LINE','SY_LINE']: 
        # datas5: {'水源管': '1030002', '输配水管': '1031002'}        
        sql = "update 给水管线 set 线标准代码=1031002 where 管线亚级类别='输配水管'"
        cur3.execute(sql)
        sql = "update 给水管线 set 线标准代码=1030002 where 管线亚级类别='水源管'"
        cur3.execute(sql)
        # print('done')
    elif table in ['TR_LINE']:        
        sql = "update 燃气管线 set 线标准代码=1052012 where 压力值='高压'"
        cur3.execute(sql)
        sql = "update 燃气管线 set 线标准代码=1052042 where 压力值='次高压'"
        cur3.execute(sql)
        sql = "update 燃气管线 set 线标准代码=1052022 where 压力值='中压'"
        cur3.execute(sql)       
        sql = "update 燃气管线 set 线标准代码=1052032 where 压力值='低压'"
        cur3.execute(sql)       
    elif table in ['WS_LINE', 'YS_LINE']:
        if table == 'WS_LINE':
            sql = "update 排水管线 set 线标准代码=1041002 where 管线亚级类别='污水'"
        else:
            sql = "update 排水管线 set 线标准代码=1040002 where 管线亚级类别='雨水'"
        cur3.execute(sql)

# 此函数用于处理所有的管点表.
def handlePointTable(table):
    if table in ['DX_POINT']:
        Ttable = '电信管点'
        handlePointTable2(table, Ttable)            
    elif table in ['GD_POINT', 'LD_POINT']:
        Ttable = '电力管点'
        handlePointTable2(table, Ttable)
    elif table in ['RS_POINT','ZQ_POINT']:
        Ttable = '热力管点'
        handlePointTable2(table, Ttable)
    elif table in ['SP_POINT','SY_POINT']:
        Ttable = '给水管点'
        handlePointTable2(table, Ttable)
    elif table in ['TR_POINT']:
        Ttable = '燃气管点'
        handlePointTable2(table, Ttable)
    elif table in ['WS_POINT', 'YS_POINT']:
        Ttable = '排水管点'
        handlePointTable2(table, Ttable)
    elif table in ['BM_POINT']:
        Ttable = '不明管点'
        handlePointTable2(table, Ttable)
    elif table in ['JK_POINT']:
        Ttable = '监控管点'
        handlePointTable2(table, Ttable)
    elif table in ['XH_POINT']:
        Ttable = '信号管点'
        handlePointTable2(table, Ttable)
    elif table in ['EX_POINT']:
        Ttable = '电力通讯管点'
        handlePointTable2(table, Ttable)

# 此函数用于简化handlePointTable函数。
def handlePointTable2(Otable, Ttable):
    insertIntoPointTable(Otable, Ttable)
    handlePointCode(Otable, Ttable)

# 此函数用于预处理查询数据,及插入数据到相应的管点表。
def handleSelectDataP(datas, sql):
    for d in datas:
        # print(d)
        e = []
        for x in d:
            if x:
                e.append(x)
            else:
                e.append('')
        if e[-1] == '':
            e[-1] = 0        
        if e[-2] == '':
            e[-2] = 0
        if e[-3] == '':
            e[-3] = 0
        if e[-4] == '':
            e[-4] = 0
        if e[-5] == '':
            e[-5] = 0
        # print(tuple(e))
        sql2 = sql + str(tuple(e))
        # print(sql2)
        # print()
        cur3.execute(sql2)
        conn3.commit()

# 此函数定义插入语句.Otable, Ttable分别代表原数据表,目标数据表
def insertIntoPointTable(Otable, Ttable):
    # 1.定义查询语句
    cur1.execute('select 管点编号,特征,附属物,要素代码,图幅号,勘测单位,权属单位,\
        精度级别,备注,X坐标,Y坐标,地面高程,井底埋深,建设日期 from ' + Otable)
    # 这种方法可以全部导入.
    datas1 = cur1.fetchall()
    # 2.定义插入语句
    sql = 'insert into ' + Ttable + '(物探点号,特征,附属物,点标准代码,图幅号,\
    勘测单位,权属单位,精度级别,备注,X,Y,地面高程,井底埋深,建设日期) values'
    handleSelectDataP(datas1, sql)
    # 3.定义更新语句.
    sql2 = "update " + Ttable + " set 数据类型='现状',精度级别='物探'"
    cur3.execute(sql2)
    # 以下要处理井底高程.井底高程 = 地面高程 - 井底埋深.
    datas3 = calJingDiGaoCheng(Otable)
    # 以下要插入井底高程到此表中相应的字段.
    for x in datas3:
        t = addQuotes(x[0])
        sql = "update " + Ttable + " set 井底高程=" + x[1] + " where 物探点号=" + t
        cur3.execute(sql)

# 此函数用于计算井底高程
def calJingDiGaoCheng(table):
    cur1.execute('select 管点编号,地面高程,井底埋深 from ' + table)
    datas2 = cur1.fetchall()
    # print("地面高程,井底埋深:", datas2)
    # print()
    datas2 = list(datas2)
    # datas3用以存放处理过的datas2的数据.
    # datas3里存放的就是相应点的井底高程,数据结构[(管点编号,井底高程), ...].
    datas3 = []
    for data in datas2:
        if data[1] and data[2]:
            datas3.append((data[0],str(round(data[1] - data[2], 2))))
        else:
            datas3.append((data[0],'0.00'))
    return datas3

# 此函数用于处理点标准代码.
def handlePointCode(Otable, Ttable):
    # datas9 里边存放 原数据特征,附属物与目标数据附属物的对应关系    
    datas9 = []
    # datas4里存放 附属物,点标准代码。    
    datas4 = {}       
    if Otable in ['DX_POINT']:
        datas9 = [
        ('非普查', None, '电信探测点'), (None, '手孔', '电信手孔'), 
        ('三分支', '手孔', '电信手孔'), ('转折点', None, '电信人孔'), 
        ('探测点', None, '电信探测点'), (None, '人孔', '电信人孔'), 
        ('上杆', None, '电信上杆'), ('四分支', '手孔', '电信手孔'), 
        ('五分支', '手孔', '电信手孔'), (None, '接线箱', '电信接线箱'), 
        ('预留口', None, '电信人孔'),('起始点',None,'电信探测点'),
        (None,'上杆','电信上杆'),('起终点','出地','电信探测点'),
        ('非普查区',None,'电信探测点'),('出地',None,'电信探测点')]
        datas4 = {
        ('电信探测点', '1025001'), ('电信人孔', '1024011'), 
        ('电信手孔', '1024021'),('电信上杆','1024051'),
        ('电信接线箱','1024031')}
    elif Otable in ['LD_POINT','GD_POINT']:
        datas9 = [
        ('非普查', None, '电力探测点'), ('三分支', '接线箱', '电力控制柜'), 
        ('三分支', None, '电力检修井'), (None, '检修井', '电力检修井'), 
        ('转折点', None, '电力检修井'), ('上杆', None, '电力上杆'), 
        (None, '接线箱', '电力控制柜'), ('探测点', None, '电力探测点'), 
        ('直线点', None, '电力探测点'),('三分支', '灯杆', '电力上杆'), 
        (None, '灯杆', '电力上杆'), ('预留口', None, '电力开闭站'),
        ('起止点','配电房','电力开闭站'),(None,'配电房','电力开闭站'),
        ('接线箱',None,'电力控制柜'),('非普查区', None, '电力探测点'),
        (None,'上杆','电力上杆'),('起止点',None,'电力探测点')]
        datas4 = {
        ('电力检修井', '1018041'), ('电力开闭站', '1018101'), 
        ('电力控制柜', '1018051'), ('电力上杆', '1018081'), 
        ('电力探测点', '1019001')}
    elif Otable in ['RS_POINT','ZQ_POINT']:
        datas9 = [
        ('非普查', None, '热力探测点'),('三通', None, '热力检修井'),
        (None, '阀门', '热力检修井'),(None, '检修井', '热力检修井'),
        ('转折点', None, '热力探测点'),('探测点', None, '热力探测点'),
        ('架空点', None, '热力探测点'),('堵头',None,'热力堵头'),
        ('出地点',None,'热力变径点'),(None,'阀门井','热力检修井'),
        ('预留口',None,'热力探测点')]
        datas4 = {
        ('热力检修井', '1062031'), ('热力堵头', '1062101'), 
        ('热力变径点', '1062061'), ('热力探测点', '1063001')}
    elif Otable in ['SP_POINT','SY_POINT']:
        datas9 = [
        ('非普查', None, '给水探测点'),('三通', None, '给水探测点'),
        ('拐点', None, '给水探测点'),('探测点', None, '给水探测点'),
        ('堵头', None, '给水堵头'),(None, '消防栓', '给水地上消防栓'),
        (None, '阀门井', '给水排气阀井'),('预留口', None, '给水阀门井'),
        (None,'检修井','给水阀门井'),('弯头',None,'给水探测点'),
        (None,'入户','给水探测点'),('四通',None,'给水探测点'),
        ('起终点','非普查区','给水探测点'),('起止点',None,'给水探测点'),
        ('非普查区',None,'给水探测点'),('入户',None,'给水探测点')]
        datas4 = {
        ('给水排气阀井', '1035041'), ('给水进水口', '1035121'), 
        ('给水地上消防栓', '1035061'), ('给水泵站', '1035111'), 
        ('给水阀门井', '1035021'), ('给水变径点', '1035211'), 
        ('给水堵头', '1035251'), ('给水探测点', '1036001')}
    elif Otable == 'TR_POINT':        
        datas9 = [
        ('非普查', None, '燃气探测点'),('预留口', None, '燃气检修井'),
        ('三通', None, '燃气阀门井'),('拐点', None, '燃气探测点'),
        (None, '调压柜', '燃气调压箱'),(None, '调压箱', '燃气调压箱'),
        ('变径点', None, '燃气检修井'),(None, '阀门', '燃气阀门井'),
        (None, '检修井', '燃气检修井'),('三通', '检修井', '燃气检修井'),
        (None, '阀门井', '燃气阀门井'),(None, '凝水缸', '燃气凝水缸'),
        ('探测点', None, '燃气探测点'),('四通',None,'燃气探测点'),
        ('上杆',None,'燃气上杆'),(None,'预留口','燃气探测点'),
        (None,'入户','燃气探测点'),('起止点',None,'燃气探测点'),
        ('弯头',None,'燃气探测点'),('起终点',None,'燃气探测点'),
        (None,'调压站','燃气调压箱'),('非普查区',None,'燃气探测点'),
        ('直线点',None,'燃气探测点'),('出地点',None,'燃气探测点')]
        datas4 = {
        ('燃气凝水缸', '1053031'), ('燃气探测点', '1054001'), 
        ('燃气调压箱', '1053041'), ('燃气阀门井', '1053011'), 
        ('燃气检修井', '1053081')}
    elif Otable in ['YS_POINT','WS_POINT']:     
        datas9 = [
        ('非普查', None, '排水非普查区去向'),('三通', None, '排水检修井'),
        ('拐点', None, '排水检修井'),('四通', '污水井', '排水检修井'),
        (None, '污篦', '排水方形雨水篦'),('三通', '污水井', '排水检修井'),
        ('化粪池', None, '排水检修井'),(None, '污水井', '排水检修井'),
        ('预留口', None, '排水预留口'),('四通', '雨篦', '排水方形雨水篦'),
        ('四通', '雨水井', '排水检修井'),('三通', '雨篦', '排水方形雨水篦'),
        (None, '雨篦', '排水方形雨水篦'),('出水口', None, '排水出水口'),
        ('三通', '雨水井', '排水检修井'),(None, '雨水井', '排水检修井'),
        ('起止点','进水口','排水进水口'),('起止点',None,'排水探测点'),
        ('起止点','雨水篦','排水方形雨水篦'),(None,'进水口','排水进水口'),
        ('探测点',None,'排水探测点'),('非普查区', None, '排水非普查区去向'),
        (None,'雨水篦','排水方形雨水篦'),(None,'出水口','排水出水口')]
        datas4 = {
        ('排水探测点', '1044001'), ('排水非普查区去向', '1043111'), 
        ('排水预留口', '1043071'), ('排水出水口', '1043031'), 
        ('排水检修井', '1043011'),('排水方形雨水篦','1043041')}
    # 以下要处理转换后数据的附属物
    if datas9:   
        for x in datas9:
            yt = x[0]
            yf = x[1]
            mf = x[2]
            if yt and yf:
                yt = addQuotes(x[0])
                yf = addQuotes(x[1])
                mf = addQuotes(x[2])
                # print()
                # print(yt,yf,mf, sep='\n')
                # print()
                sql = "update " + Ttable + " set 附属物=" + mf + " where 特征=" + yt + " and 附属物=" + yf
                cur3.execute(sql)
            elif yt:
                yt = addQuotes(x[0])            
                mf = addQuotes(x[2])
                # print()
                # print(yt,mf, sep='\n')
                # print()
                sql = "update " + Ttable + " set 附属物=" + mf + " where 特征=" + yt
                cur3.execute(sql)
            elif yf:            
                yf = addQuotes(x[1])
                mf = addQuotes(x[2])
                # print()
                # print(yf,mf, sep='\n')
                # print()
                sql = "update " + Ttable + " set 附属物=" + mf + " where 附属物=" + yf
                cur3.execute(sql)
        conn3.commit()
    # 以下要处理点标准代码
    if datas4:
        for x in datas4:
            f = x[0]
            fc = x[1]        
            sql = "update " + Ttable + " set 点标准代码=" + fc + " where 附属物=" + addQuotes(f)
            cur3.execute(sql)
        else:
            sql = "update " + Ttable + " set 点标准代码='' where 附属物=''"
            cur3.execute(sql)
    else:
        sql = "update " + Ttable + " set 点标准代码=''"
        cur3.execute(sql)
    # 以下要处理转换后数据的特征.
    if Otable in ["DX_POINT"]:
        sql = "update " + Ttable + " set 特征='转折点' where 特征='探测点' or 特征='非普查'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='变化点' where 特征='预留口'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='上杆点' where 特征='上杆'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='起止点' where 特征='起始点' or 特征='起终点' or 特征='出地'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='直通点' where 特征='非普查区'"
        cur3.execute(sql)
        # sql = "update " + Ttable + " set 特征='上杆点' where 特征 is NULL"
        # cur3.execute(sql)
    elif Otable in ["GD_POINT", "LD_POINT"]:
        sql = "update " + Ttable + " set 特征='直通点' where 特征='直线点' or 特征='非普查' or 特征='探测点' or 特征='非普查区'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='上杆点' where 特征='上杆'"
        cur3.execute(sql)    
        sql = "update " + Ttable + " set 特征='起止点' where 特征='预留口'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='变化点' where 特征='接线箱'"
        cur3.execute(sql)
    elif Otable in ["RS_POINT",'ZQ_POINT']:
        sql = "update " + Ttable + " set 特征='直通点' where 特征='架空点' or 特征='非普查' or 特征='探测点'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='起止点' where 特征='堵头'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='变化点' where 特征='出地点'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='三通' where 特征='预留口'"
        cur3.execute(sql)
    elif Otable in ["SP_POINT",'SY_POINT']:
        sql = "update " + Ttable + " set 特征='起止点' where 特征='堵头' or 特征='起终点' or 特征='入户'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='直通点' where 特征='非普查' or 特征='探测点' or 特征='非普查区'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='弯头' where 特征='拐点'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='变化点' where 特征='预留口'"
        cur3.execute(sql)
    elif Otable == "TR_POINT":
        sql = "update " + Ttable + " set 特征='直通点' where 特征='变径点' or 特征='预留口' or 特征='非普查' or 特征='探测点' or 特征='非普查区' or 特征='直线点'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='弯头' where 特征='拐点'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='上杆点' where 特征='上杆'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='变化点' where 特征='出地点'"
        cur3.execute(sql)
    elif Otable in ["WS_POINT", "YS_POINT"]:
        sql = "update " + Ttable + " set 特征='起止点' where 特征='化粪池' or 特征='非普查' or 特征='预留口' or 特征='出水口' or 特征='探测点' or 特征='非普查区'"
        cur3.execute(sql)
        sql = "update " + Ttable + " set 特征='转折点' where 特征='拐点'"
        cur3.execute(sql)

# 此函数用于给字符串,再加一层引号.
# 例:s='a' s = addQuotes(s) s-->'"a"'
def addQuotes(string):
    t = list(string)
    t.append("\'")
    t.insert(0, "\'")
    t = "".join(t)
    return t

# 以下处理Ptables的 物探点号
def handlePointNum(Ptables):
    for t in Ptables:
        # print(t)
        sql = "select 物探点号 from " + t
        cur3.execute(sql)
        datas = cur3.fetchall()
        # print(datas)
        # print()
        for d in datas:
            num = d[0]
            updateNum(t, '物探点号', num)

# 以下处理Ltables的 起始点号,终止点号
def handleLineNum(Ltables):
    for t in Ltables:
        # print(t)
        sql = "select 起始点号,终止点号 from " + t
        cur3.execute(sql)
        datas = cur3.fetchall()
        # print(datas)
        # print()
        for d in datas:
            num = d[0]
            updateNum(t, '起始点号', num)            
            num = d[1]
            updateNum(t, '终止点号', num)

#  此函数用于处理所有管点表的物探点号,所有管线表的起始点号,终止点号
def updateNum(table, field, num):
    B = 11 - len(num) - 2
    if num[0].isdigit():
        num2 = num[1:3] + "AV" + '0' * B + num[0] + num[3:]
    else:
        num2 = num[0:2] + "AV" + '0' * B + num[2:]
    if len(num2) == 11:
        sql = "update " + table + " set " + field + "=" + addQuotes(num2) + " where " + field + "=" + addQuotes(num)
        cur3.execute(sql)
    else:
        B = len(num2) - 11
        num3 = num2[:-B]
        sql = "update " + table + " set " + field + "=" + addQuotes(num3) + " where " + field + "=" + addQuotes(num)
        cur3.execute(sql)
    conn3.commit()

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值