使用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 相关文章推荐
python进阶教程之循环对象
Aug 30 Python
Python中max函数用法实例分析
Jul 17 Python
python中map()与zip()操作方法
Feb 27 Python
python变量不能以数字打头详解
Jul 06 Python
利用Python爬取可用的代理IP
Aug 18 Python
pycharm安装图文教程
May 02 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
Python实现SMTP邮件发送
Jun 16 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
PHP 数据库树的遍历方法
2009/02/06 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python实现简单多人聊天室
2018/12/11 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
生物技术研究生自荐信
2013/11/12 职场文书
个人求职信范文分享
2014/01/06 职场文书
应届毕业生自荐信
2014/05/28 职场文书
心得体会的写法
2014/09/05 职场文书
经验交流材料格式
2014/12/30 职场文书
2016党校培训心得体会
2016/01/07 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python