zoukankan      html  css  js  c++  java
  • 批量追加数据库(GDB,MDB,Shp)

    程序需要追加的要素类的结构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())
    高调做事,低调做人~!
  • 相关阅读:
    SAS学习笔记5 字符截取语句(index、compress、substr、scan函数)
    SAS学习笔记4 基本运算语句(lag、retain、_n_函数)
    SAS学习笔记3 输入输出格式(format、informat函数)
    SAS学习笔记2 基础函数应用
    特性与反射
    WebApi 接口返回值类型详解 ( 转 )
    C# 数据类型转化为byte数组
    关于.Net中Process和ProcessStartInfor的使用
    C#双缓冲解释
    如何获取到一个form中的所有子控件?
  • 原文地址:https://www.cnblogs.com/514687800/p/5109974.html
Copyright © 2011-2022 走看看