使用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压缩文件夹内所有文件为zip文件的方法
Jun 20 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
使用python实现省市三级菜单效果
Jan 20 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
python 文件操作删除某行的实例
Sep 04 Python
python操作excel的方法(xlsxwriter包的使用)
Jun 11 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
centos 安装Python3 及对应的pip教程详解
Jun 28 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
如何基于线程池提升request模块效率
Apr 18 Python
如何利用python 读取配置文件
Jan 06 Python
Pytorch 统计模型参数量的操作 param.numel()
May 13 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过滤★等特殊符号的正则
2014/01/27 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
javascript第一课
2007/02/27 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
C#笔试题
2015/07/14 面试题
汽车销售求职自荐信
2013/10/01 职场文书
销售部主管岗位职责
2013/12/18 职场文书
电钳专业个人求职信
2014/01/04 职场文书
《自选商场》教学反思
2014/02/14 职场文书
文明班级申报材料
2014/12/24 职场文书
辅导员学期工作总结
2015/08/14 职场文书
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python