使用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 相关文章推荐
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
python+opencv识别图片中的圆形
Mar 25 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python 异或加密字符串的实例
Oct 14 Python
Python中is和==的区别详解
Nov 15 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
Python 日期区间处理 (本周本月上周上月...)
Aug 08 Python
Python定时任务随机时间执行的实现方法
Aug 14 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
python-地图可视化组件folium的操作
Dec 14 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 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
与数据库连接
2006/10/09 PHP
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
CI框架自动加载session出现报错的解决办法
2014/06/17 PHP
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
详解jQuery的表单验证插件--Validation
2016/12/21 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
python编写的最短路径算法
2015/03/25 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
python数据结构之链表的实例讲解
2017/07/25 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
python实现交并比IOU教程
2020/04/16 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
css3高级选择器使用方法
2013/12/02 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
人事专员的职责
2014/02/26 职场文书
园林设计专业毕业生求职信
2014/03/23 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript
python库sklearn常用操作
2021/08/23 Python
python文件与路径操作神器 pathlib
2022/04/01 Python