首页 > 数据库技术 > 详细

批量追加数据库(GDB,MDB,Shp)

时间:2016-01-07 16:17:20      阅读:641      评论:0      收藏:0      [点我收藏+]

程序需要追加的要素类的结构Schema格式一致,将遍历后的第一个工作空间为范本,后续进行追加。

# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------------
# 质检处_汪林
# Created on: 2014-09-29 10:25:22.00000
#   (generated by ArcGIS/ModelBuilder)
# Description: 可以追加Shape、MDB、GDB  结果存放在AppendResult文件夹中
# ---------------------------------------------------------------------------

# Import arcpy module
import os
import shutil
import sys
import arcpy
import os.path
import time
from arcpy import env

FCDBDir = "E:\\复杂繁体"
dicAllFC={}
fcall=[]
GDBAllPath=[]

#复制函数
def copytree(src,dst,symlinks=False):
    #如果目标目录不存在,则创建目录
    if not os.path.isdir(dst):
        os.makedirs(dst)
    errors=[]
    if os.path.isdir(src):
        names = os.listdir(src)
        for name in names:
            srcname = os.path.join(src,name)
            dstname = os.path.join(dst,name)
            try:
                #链接地址
                if symlinks and os.path.islink(srcname):
                    linkto = os.readlink(srcname)
                    os.symlink(linkto,dstname)
                #目录
                elif os.path.isdir(srcname):
                    copytree(srcname,dstname,symlinks)
                #文件
                else:
                    #复制前删除目录和文件
                    if os.path.isdir(dstname):
                        os.rmdir(dstname)
                    elif os.path.isfile(dstname):
                        os.remove(dstname)
                    shutil.copy2(srcname,dstname)
            except (IOError,os.error) as why:
                errors.append((srcname,dstname,str(why)))
            except OSError as err:
                errors.extend(err.args[0])
            try:
                shutil.copystat(src,dst)
            except WindowsError:
                pass
            except OSError as why:
                errors.extend((src,dst,str(why)))
            if errors:
                raise Exception(errors)
    elif os.path.isfile(src):
        try:
            parentdir = os.path.dirname(src)
            filename = os.path.basename(src)
            srcname = src
            dstname = os.path.join(dst,filename)
            #复制前删除目录和文件
            if os.path.isdir(dstname):
                os.rmdir(dstname)
            elif os.path.isfile(dstname):
                os.remove(dstname)
            shutil.copy2(srcname,dstname)
        except (IOError,os.error) as why:
            errors.append((srcname,dstname,str(why)))
        except OSError as err:
            errors.extend(err.args[0])
        try:
            shutil.copystat(src,dst)
        except WindowsError:
            pass
        except OSError as why:
            errors.extend((src,dst,str(why)))
        if errors:
            raise Exception(errors)






if not isinstance(FCDBDir,unicode):
    FCDBDir = FCDBDir.decode(utf-8)
    
if os.path.exists(FCDBDir):
    for dirpath,dirnames,filenames in os.walk(FCDBDir):
        # 遍历GDB文件夹 获取GDB
        for dirname in dirnames:
            if ".gdb" in dirname:
                gdbfilepath = os.path.join(dirpath,dirname)
                if not gdbfilepath in  GDBAllPath:
                    GDBAllPath.append(gdbfilepath)
        # 遍历MDB文件夹 获取MDB
        for filename in filenames:
            if os.path.splitext(filename)[1]==.mdb:
                mdbfilepath = os.path.join(dirpath,filename)
                if not mdbfilepath in GDBAllPath:
                    GDBAllPath.append(mdbfilepath)
        # 遍历Shp文件夹  获取Shape
        for filename in filenames:
            if os.path.splitext(filename)[1]==.shp:
                shpfilepath = os.path.join(dirpath,filename)
                if not dirpath in GDBAllPath:
                    GDBAllPath.append(dirpath)
else:
    print "Directory "+FCDBDir+" Not Exist"
    sys.exit(0)
if os.path.exists(FCDBDir):
    if GDBAllPath and len(GDBAllPath)>0:
        if len(GDBAllPath) == 1:
            print "Directory "+FCDBDir+" Has Only One GDB or MDB or Shape WorkeSpace"
            sys.exit(0)
        firstPath = GDBAllPath[0]
        # 判断工作空间一致性
        for i in range(1,len(GDBAllPath)):
            tempPath = GDBAllPath[i]
            if ".gdb" in firstPath:
                if not ".gdb" in tempPath:
                    print "Directory "+FCDBDir+" First Item Is GDB WorkSpace But "+tempPath +" Is Not All GDB WorkeSpace"
                    sys.exit(0)
                    break
            elif ".mdb" in firstPath:
                if not ".mdb" in tempPath:
                   print "Directory "+FCDBDir+" First Item Is MDB WorkSpace But "+tempPath +" Is Not All MDB WorkeSpace"
                   sys.exit(0)
                   break
            else:
                if not os.path.isdir(tempPath):
                    print "Directory "+FCDBDir+" First Item Is SHP WorkSpace But "+tempPath +" Is Not All SHP WorkeSpace"
                    sys.exit(0)
                    break
        #获取上层目录
        parentDir = os.path.dirname(firstPath)
        resultDir = os.path.join(parentDir,"AppendResult")
        try:
            if ".gdb" in firstPath:
                basename = os.path.basename(firstPath)
                resultDir = os.path.join(resultDir,basename)
            copytree(firstPath,resultDir,False)
        except Exception as ex:
            print "copy From "+firstPath+" To "+resultDir +" Failed "+str(ex)
            sys.exit(0)
    else:
        print "Directory "+FCDBDir+" Not Found GDB or MDB Or Shape"


#Get Dataset and FeatureClass,Store in dicAllFC,Key =ds value= fc 如果是游离的shape 和 shape  dataset特殊
if os.path.exists(FCDBDir):
    if GDBAllPath and len(GDBAllPath)>0:
        firstPath = GDBAllPath[0]
        env.workspace = firstPath
        singlefclist = arcpy.ListFeatureClasses("","All")
        if singlefclist and len(singlefclist)>0:
            for singlefc in singlefclist:
                if .shp in singlefc:
                    if not dicAllFC.has_key(@shpFC$):
                        #set表示无序不重复集合
                        dicAllFC.setdefault(@shpFC$,set()).add(singlefc)
                    else:
                        if not singlefc in dicAllFC[@shpFC$]:
                            dicAllFC.setdefault(@shpFC$,set()).add(singlefc)
                else:
                    #list表示无序可重复集合
                    if not dicAllFC.has_key(@singleFC$):
                        dicAllFC.setdefault(@singleFC$,[]).append(singlefc)
                    else:
                        if not singlefc in dicAllFC[@singleFC$]:
                            dicAllFC.setdefault(@singleFC$,[]).append(singlefc)
        datasetlist = arcpy.ListDatasets("","Feature")
        for dataset in datasetlist:
            # 如果dataset是unicode则不做改变,否则将utf-8的dataset编码解码成unicode
            if not isinstance(dataset,unicode):
                dataset = dataset.decode(utf-8)
            if isinstance(firstPath,unicode):
                env.workspace = firstPath+"\\"+dataset
            else:
                env.workspace = firstPath+"\\"+dataset.encode(gb2312)
            fclist = arcpy.ListFeatureClasses("")
            if fclist and len(fclist)>0:
                if not dicAllFC.has_key(dataset):
                    dicAllFC[dataset]=fclist
if dicAllFC:
    firstPath = GDBAllPath[0]
    for (k,v) in dicAllFC.items():
        for singlefc in v:
             # 如果fc是unicode则不做改变,否则将utf-8的fc编码解码成unicode
            if not isinstance(singlefc,unicode):
                singlefc = singlefc.decode(utf-8)
            # 如果ds是unicode则不做改变,否则将utf-8的ds编码解码成unicode   
            if not isinstance(k,unicode):
                k = k.decode(utf-8)
            for singlegdbPath in GDBAllPath:
                if isinstance(singlegdbPath,unicode):
                    fcFullPath =singlegdbPath+"\\"+k+"\\"+singlefc if k!=@shpFC$ and k!=@singleFC$ else singlegdbPath+"\\"+singlefc
                else:
                    fcFullPath = singlegdbPath+"\\"+k.encode(gb2312)+"\\"+singlefc.encode(gb2312) if k!=@shpFC$ and k!=@singleFC$ else singlegdbPath+"\\"+singlefc.encode(gb2312)
                if arcpy.Exists(fcFullPath) and fcFullPath not in fcall:
                    fcall.append(fcFullPath)
                else:
                    print fcFullPath + " Not Exist ****************************************"
            if fcall and len(fcall)>=2:
                targetFC = fcall.pop(0)
                # Append的要素类名称
                fcname = os.path.basename(targetFC)                
                basename = os.path.basename(firstPath)
                parentDir = os.path.dirname(firstPath)
                resultDir = os.path.join(parentDir,"AppendResult")
                if ".gdb" in firstPath or ".mdb" in firstPath:
                    resultDir = os.path.join(resultDir,basename)
                targetFC = resultDir+"\\"+k+"\\"+fcname if k!=@shpFC$ and k!=@singleFC$ else resultDir+"\\"+fcname                    
                try:
                    arcpy.Append_management(fcall,targetFC,"TEST","","");
                    print targetFC+"@@@Succeeded At "+time.strftime("%Y-%m-%d %X",time.localtime())+"###Contains "+str(len(fcall)+1)
                    fcall=[]
                except Exception as inst:
                    if not isinstance(str(inst),unicode):
                        instunicode = str(inst).decode(utf-8)
                        print targetFC+"@@@Failed At "+time.strftime("%Y-%m-%d %X",time.localtime())+"###Contains "+str(len(fcall)+1)+instunicode
                    else:
                        print targetFC+"@@@Failed At "+time.strftime("%Y-%m-%d %X",time.localtime())+"###Contains "+str(len(fcall)+1)+str(inst)
                    fcall=[]
print "Complete At "+time.strftime("%Y-%m-%d %X",time.localtime())

 

批量追加数据库(GDB,MDB,Shp)

原文:http://www.cnblogs.com/514687800/p/5109974.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!