通过一个小项目介绍Python3读写Access数据库(.mdb)的方法

1. 小项目功能介绍

本文通过一个小项目介绍Python3读写Access数据库(.mdb)的方法,该项目功能较简单,将mdb中的旧编码替换为新编码,新旧编码对照表放在1个excel(本文命名为新旧编码对照表.xlsx)中,功能实现主要分为三步:

1)读取mdb所有的表,获取每个表的PartNumber列(旧编码所在的列)的每个编码。

2)读取新旧编码对照表.xlsx,找到“旧编码”和“新编码”所在的单元格,并判断步骤1中的编码是否为旧编码。若是旧编码,则找到对应的新编码;若是新编码,则给出错误提示;若未找到,则给出警告。

3)用获取到的新编码替换原来的旧编码。

新旧编码对照表.xlsx的内容如下:

图1 新旧编码对照表.xlsx的内容

mdb文件的内容如下。

 

图2 mdb文件表Table_Capacitor的内容

图2 mdb文件表Table_BJT的内容

2. 代码实现

代码实现如下:

#!/usr/bin/env python
# -*- conding: utf-8 -*-
import pypyodbc
import xlrd

def find_in_excel(path,word):
    data = xlrd.open_workbook(path)
    table = data.sheets()[0]
    nrows = table.nrows#excel总行数
    ncols = table.ncols#excel总列数
    #print(nrows,ncols)
    for r in range(nrows):
        for c in range(ncols):
            cell = table.cell(r,c).value
            if(isinstance(cell,float) or isinstance(cell,int)):
                cell = str(int(cell))
            if(cell == u"旧编码"):
                old_code_col = c
            elif(cell == u"新编码"):
                new_code_col = c
            elif(cell == word):
                print("cell = %s" %cell)
                if(old_code_col == c):
                    new_code = table.cell(r,c+1).value
                    if(isinstance(new_code,float) or isinstance(new_code,int)):
                        new_code = str(int(new_code))
                    return (0,new_code)#若是旧编码,则直接返回新编码
                elif(new_code_col == c):
                    #print("new_code_col = %d" %new_code_col)
                    return (1,cell)#若是新编码,则返回新编码           
    return (-1,-1)

if __name__=="__main__":
    tables = ['BJT',
              'Capacity','Connector','Diode','ForBOM',
              'IC','Inductor','Mechanical','MOSFET',
              'NoPartNumber','Other','Resistor']
    tables = ['Table_BJT','Table_Capacitor']
    print(len(tables))
    
    for table in tables:
        mdb = 'Driver={Microsoft Access Driver (*.mdb,*.accdb)};DBQ=C:\\Users\\liyua\\Desktop\\1.mdb'
        conn = pypyodbc.win_connect_mdb(mdb)
        cur = conn.cursor()
        sql = "SELECT * FROM " + table
        print(sql)
        cur.execute(sql)
        alldata = cur.fetchall()
        total_rows = len(alldata)
        total_cols = len(alldata[0])
        print("****************Begin to process\"表:%s\"****************" %table)
        print("\"表:%s\"总行数 = %d" %(table,total_rows))
        print("\"表:%s\"总列数 = %d" %(table,total_cols))
        
        for row in range(0,total_rows):
            sql = "SELECT [Part Number] FROM " + table #带空格时必须用[]包括
            cur = conn.cursor()
            cur.execute(sql)
            
            Part_Numbers = cur.fetchall()
            PartNumber = Part_Numbers[row][0]
            
            if(isinstance(PartNumber,float) or isinstance(PartNumber,int)):
                PartNumber = str(int(PartNumber))
            
            result = find_in_excel(r"C:\Users\liyua\Desktop\1.xlsx",PartNumber)
            if(result[0]==0):
                print("\"表:%s\"中%s为旧编码,对应的新编码为:%s" %(table,PartNumber,result[1]))
                sql = "Update [" + table + "] Set [Part Number] = '" + result[1] + "' where " + "[Part Number]" + " = " + "'" + PartNumber + "'"
                print(sql)
                cur.execute(sql)
                conn.commit()
                cur.close()
        
            elif(result[0]==1):
                print("error!%s已经为新编码" %result[1])
                continue
            elif(result[0]== (-1)):
                print("warning!未在excel中找到\"表:%s\"中的编码:%s" %(table,PartNumber))
                continue
            
        print("****************End processing\"表:%s\"****************" %table)
        conn.close()
    print("****************所有表处理完毕****************")

3. 执行结果

图3 代码执行结果

处理过后的mdb的内容如下:

图4 处理后的mdb文件表Table_Capacitor的内容

注意上图中对应ID=4的Part Number(11030231)在excel中未找到,所以上图中并未更新为新编码。

图5 处理后的mdb文件表Table_BJT的内容

  • 6
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Python可以通过多种方式连接和读写Access数据库,以下是一些常用的方法: 1. pypyodbc包 pypyodbc是一个Python库,可以连接到多种数据库系统,包括Access。使用pypyodbc包可以方便地连接Access数据库,读取数据到Python中进行分析和处理。 安装pypyodbc包: ```Python !pip install pypyodbc ``` 连接Access数据库: ```Python import pypyodbc db_path = 'C:/path/to/access/database.accdb' conn_str = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=%s;' % db_path conn = pypyodbc.connect(conn_str) ``` 执行SQL语句: ```Python query = "SELECT * FROM table_name" cursor = conn.cursor() cursor.execute(query) result = cursor.fetchall() ``` 关闭连接: ```Python conn.close() ``` 2. pyodbc包 pyodbc是另一个Python库,同样可以连接到多种数据库系统,包括Access。使用pyodbc包可以方便地连接Access数据库,读取数据到Python中进行分析和处理。 安装pyodbc包: ```Python !pip install pyodbc ``` 连接Access数据库: ```Python import pyodbc db_path = 'C:/path/to/access/database.accdb' conn_str = 'Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=%s;' % db_path conn = pyodbc.connect(conn_str) ``` 执行SQL语句: ```Python query = "SELECT * FROM table_name" cursor = conn.cursor() cursor.execute(query) result = cursor.fetchall() ``` 关闭连接: ```Python conn.close() ``` 总的来说,pypyodbc和pyodbc都是连接Access数据库的不错选择,具体使用哪种方法可以根据自己的需求和操作习惯来决定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力不期待

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值