使用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实现Mysql数据库连接池实例详解
Apr 11 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
Python理解递归的方法总结
Jan 28 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
Django 限制访问频率的思路详解
Dec 24 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
Python如何实现邮件功能
May 27 Python
python操作redis数据库的三种方法
Sep 10 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
Nov 17 Python
python实现简单石头剪刀布游戏
Oct 24 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函数(简单整理)
2010/04/30 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
PHP文件与目录操作示例
2016/12/24 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
js中onload与onunload的使用示例
2013/08/25 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
JS实现时间格式化的方式汇总
2013/10/16 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
python机器学习之KNN分类算法
2018/08/29 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
Python unittest框架操作实例解析
2020/04/13 Python
python实现坦克大战
2020/04/24 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
高中语文课后反思
2014/04/27 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
用Python创建简易网站图文教程
2021/06/11 Python
Spring Boot 整合 Apache Dubbo的示例代码
2021/07/04 Java/Android