使用python将mdb数据库文件导入postgresql数据库示例


Posted in Python onFebruary 17, 2014

mdb格式文件可以通过mdbtools工具将内中包含的每张表导出到csv格式文件。由于access数据库和postgresQL数据库格式上会存在不通性,所以使用python的文件处理,将所得csv文件修改成正确、能识别的格式。

导入脚本说明(此脚本运行于linux):

1.apt-get install mdbtools,安装mdbtools工具

2.将mdb 文件拷贝到linux虚拟机中,修改脚本中mdb文件目录‘dir'

3.修改服务器及数据库配置

4.执行脚本

# -*- encoding: utf-8 -*-
import os
import re
import psycopg2
import csv
#mdb文件目录
dir = r'/home/kotaimen/mdb_file/'
mdb_tbl_dic = {}

def make_create_sql():
    if os.path.isfile(dir + 'create.sql'):
        os.remove(dir + 'create.sql')

    for mdb_file in os.walk(dir):
        if len(mdb_file[2]) >0:
            for file_p in mdb_file[2]:
                if file_p[-3:] == 'mdb':
                    print file_p
                    cmd = 'mdb-schema %s  >>/home/kotaimen/mdb_file/create.sql'
                    cmd = cmd % (dir + file_p)
                    print cmd
                    os.system(cmd)
                    cmd = 'mdb-tables -1 %s ' % (dir + file_p)
                    val = os.popen(cmd).read()
                    mdb_tbl_dic[file_p] = val.split('\n')
    print mdb_tbl_dic
def modefy_create_sql():
    sql_file_name = dir + 'create.sql'
    sql_file_name_des = sql_file_name + '_new'
    fobj = open(sql_file_name, 'r')
    fobj_des = open(sql_file_name_des, 'w')
    for eachline in fobj:
        #判断表名中是否含有空格
        if eachline.find('TABLE ') >= 0:
            if eachline.find(';') >= 0:
                start_loc = eachline.find('TABLE ') + 6
                end_loc = eachline.find(';')
                tbl_name = eachline[start_loc:end_loc]
                eachline = eachline.replace(tbl_name, '"' + tbl_name + '"')
            else:
                start_loc = eachline.find('TABLE ') + 6
                end_loc = eachline.find('\n')
                tbl_name = eachline[start_loc:end_loc]
                eachline = eachline.replace(tbl_name, '"' + tbl_name + '"')
        if eachline.find('DROP TABLE') >= 0 :
            eachline = eachline.replace('DROP TABLE', 'DROP TABLE IF EXISTS')
        if eachline.find('Table') >= 0 :
            eachline = eachline.replace('Table', '"Table"')
        #create 语句,最后一行没有逗号
        if eachline.find('Text ') >= 0 and eachline.find(',') >0:
            loc = eachline.find('Text ')
            eachline = eachline[0:loc] + ' Text,\n'
        elif eachline.find('Text ') >= 0 and eachline.find(',') < 0:
            loc = eachline.find('Text ')
            eachline = eachline[0:loc] + ' Text \n'
        fobj_des.writelines(eachline)
    fobj.close()
    fobj_des.close()
    os.remove(sql_file_name)
    os.rename(sql_file_name_des, sql_file_name)
def make_insert_csv():
    for file_p in mdb_tbl_dic.keys():
        for tbl in mdb_tbl_dic[file_p]:
            if len(tbl) >0:
                cmd = 'mdb-export    %s %s >%s.csv' % (dir + file_p, '"' + tbl + '"', dir + '"' + tbl + '"')# tbl.replace(' ', '_').replace('&', '_'))
                os.system(cmd)
def modefy_insert_CSV():
    for sql_file in os.walk(dir):
        if len(sql_file[2]) >0:
            for file_p in sql_file[2]:
                if file_p[-3:] == 'csv' :
                    sql_file_name = dir + file_p
                    sql_file_name_des = sql_file_name + '_new'
                    fobj = open(sql_file_name, 'r')
                    fobj_des = open(sql_file_name_des, 'w')
                    for (num, val) in enumerate(fobj):
                        eachline = val
                        if num == 0:
                            col_list = eachline.split(',')
                            stat = 'COPY ' + '"' + (file_p[0:-4]) + '"' + ' (' #+ ('%s,'*len(line))[:-1]+')'
                            for col in col_list:
                                if col == 'Table':
                                    col = '"' + 'Table' + '"'
                                if col.find('\n') >= 0:
                                    col.replace('\n', '')
                                stat = stat + col + ','
                            stat = stat[:-2] + ')' + ' FROM STDIN WITH CSV ;\n'
                            eachline = stat
                        fobj_des.writelines(eachline)
                    fobj.close()
                    fobj_des.close()
                    os.remove(sql_file_name)
                    os.rename(sql_file_name_des, sql_file_name)

def insert_into_database():
    cmd = 'psql -h 172.26.11.205 -d ap_MapMyIndia_full_Sample -U postgres -f %s 2>>log.txt' % (dir + 'create.sql')
    os.system(cmd)
    for sql_file in os.walk(dir):
        if len(sql_file[2]) >0:
            for file_p in sql_file[2]:
                print file_p
                if file_p[-3:] == 'csv' :
                    cmd = 'psql -h 172.26.11.205 -d ap_MapMyIndia_full_Sample -U postgres -f %s 2>>log.txt' % (dir + '"' + file_p + '"')
                    os.system(cmd)

if __name__ == "__main__":
    #1.制作mdb文件中所包含TABLE的create脚本
    make_create_sql()
    #2.修改掉create脚本中的不合法字符
    modefy_create_sql()
    #3.将mdb中各表导出到csv文件中
    make_insert_csv()
    #4.修改csv脚本首行,改成copy形式
    modefy_insert_CSV()
    insert_into_database()
Python 相关文章推荐
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
深入浅析python with语句简介
Apr 11 Python
python读取xlsx的方法
Dec 25 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
PyTorch实现AlexNet示例
Jan 14 Python
python numpy--数组的组合和分割实例
Feb 24 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
学python需要去培训机构吗
Jul 01 Python
python二维图制作的实例代码
Dec 03 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
Django中的JWT身份验证的实现
May 07 Python
python Django框架快速入门教程(后台管理)
Jul 21 Python
python动态加载变量示例分享
Feb 17 #Python
python文件读写并使用mysql批量插入示例分享(python操作mysql)
Feb 17 #Python
python实现bitmap数据结构详解
Feb 17 #Python
python实现ftp客户端示例分享
Feb 17 #Python
用smtplib和email封装python发送邮件模块类分享
Feb 17 #Python
python类参数self使用示例
Feb 17 #Python
python实现爬虫下载漫画示例
Feb 16 #Python
You might like
基于mysql的bbs设计(二)
2006/10/09 PHP
php图片验证码代码
2008/03/27 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
Smarty中的注释和截断功能介绍
2015/04/09 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
jquery获得下拉框值的代码
2011/08/13 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
微信小程序自定义组件
2017/08/16 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
学习python类方法与对象方法
2016/03/15 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
Python分支语句与循环语句应用实例分析
2019/05/07 Python
Python类中self参数用法详解
2020/02/13 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
如何判断计算机可能已经中马
2013/03/22 面试题
交通专业个人自荐信格式
2013/09/23 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
教研处工作方案
2014/05/26 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
演讲开场白台词大全
2015/05/29 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
Java 在线考试云平台的实现
2021/11/23 Java/Android