使用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中函数的用法实例教程
Sep 08 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
python中解析json格式文件的方法示例
May 03 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
python实现图片处理和特征提取详解
Nov 13 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 Python
Python PIL库图片灰化处理
Apr 07 Python
Django-migrate报错问题解决方案
Apr 21 Python
PYTHON InceptionV3模型的复现详解
May 06 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产生随机字符串函数
2006/12/06 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
php将html转为图片的实现方法
2017/05/19 PHP
input的focus方法使用
2010/03/13 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
Python实现直播推流效果
2019/11/26 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
EMPHASIS艾斐诗官网:周生生旗下原创精品珠宝品牌
2020/12/17 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
校园报刊亭的创业计划书
2014/01/02 职场文书
三问三解心得体会
2014/09/05 职场文书
介绍信样本
2015/01/31 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技