使用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的Bottle框架中使用微信API的示例
Apr 23 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
Python logging模块用法示例
Aug 28 Python
python读取几个G的csv文件方法
Jan 07 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
Python lambda表达式filter、map、reduce函数用法解析
Sep 11 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
Feb 27 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
python爬虫中的url下载器用法详解
Nov 30 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 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
AM/FM收音机的安装与调试
2021/03/02 无线电
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
IStream与TStream之间的相互转换
2008/08/01 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
理解Javascript闭包
2013/11/01 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
使用js实现数据格式化
2014/12/03 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
python实现贪吃蛇游戏
2020/03/21 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
Django-migrate报错问题解决方案
2020/04/21 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
python numpy库np.percentile用法说明
2020/06/08 Python
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
2014年党务工作总结
2014/11/25 职场文书
本溪水洞导游词
2015/02/11 职场文书
学习委员竞选稿
2015/11/20 职场文书