使用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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
python有证书的加密解密实现方法
Nov 19 Python
Python 的 Socket 编程
Mar 24 Python
linux下python抓屏实现方法
May 22 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
Pyinstaller将py打包成exe的实例
Mar 31 Python
python通过微信发送邮件实现电脑关机
Jun 20 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
python async with和async for的使用
Jun 20 Python
Numpy之reshape()使用详解
Dec 26 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
PHP递归创建多级目录
2015/11/05 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
Django 中 cookie的使用
2017/08/17 PHP
完美的php分页类
2017/10/24 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
比Jquery的document.ready更快的方法
2010/04/28 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
document.createElement()用法
2013/03/13 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
Python中itertools模块用法详解
2014/09/25 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
python实现简单多人聊天室
2018/12/11 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
大学生职业生涯规划书模板
2014/01/18 职场文书
工程质量承诺书
2014/03/27 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
致青春观后感
2015/06/09 职场文书
V Rising 服务器搭建图文教程
2022/06/16 Servers