使用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中处理字符串的相关的len()方法的使用简介
May 19 Python
scrapy爬虫完整实例
Jan 25 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
May 31 Python
Python中字符串与编码示例代码
May 20 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
Django认证系统user对象实现过程解析
Mar 02 Python
python实现QQ邮箱发送邮件
Mar 06 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
利用python汇总统计多张Excel
Sep 22 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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
PHP图片上传类带图片显示
2006/11/25 PHP
php结合飞信 免费天气预报短信
2009/05/07 PHP
php输出表格的实现代码(修正版)
2010/12/29 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
python使用mailbox打印电子邮件的方法
2015/04/30 Python
python编写弹球游戏的实现代码
2018/03/12 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
大学生创业计划书的格式要求
2013/12/29 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
竞聘自述材料
2014/08/25 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
看上去很美观后感
2015/06/10 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
导游词之山东八大关
2019/12/18 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
使用Python开发冰球小游戏
2022/04/30 Python