#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Code.gamecfg_export # # @todo:ÓÎÏ·¿Í»§¶Ë·þÎñ¶ËÅäÖÃÎļþµ¼³ö # @author hxp # @date 2017-07-19 # @version 1.0 # # ÏêϸÃèÊö: ¸ù¾Ý²ß»®ÅäÖõÄĸ±í¸ñµ¼³ö¿Í»§¶Ë·þÎñ¶Ë³ÌÐòʹÓõÄÅäÖÃÎļþ # #------------------------------------------------------------------------------- #"""Version = 2017-07-19 12:00""" #------------------------------------------------------------------------------- import ctypes import ConfigParser import xlrd import sys import os #################################################################################################### STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -12 # ×ÖÌåÑÕÉ«¶¨Òå ,¹Ø¼üÔÚÓÚÑÕÉ«±àÂ룬ÓÉ2λʮÁù½øÖÆ×é³É£¬·Ö±ðÈ¡0~f£¬Ç°Ò»Î»Ö¸µÄÊDZ³¾°É«£¬ºóһλָµÄÊÇ×ÖÌåÉ« #ÓÉÓڸú¯ÊýµÄÏÞÖÆ£¬Ó¦¸ÃÊÇÖ»ÓÐÕâ16ÖÖ£¬¿ÉÒÔǰ¾°É«Óë±³¾°É«×éºÏ¡£Ò²¿ÉÒÔ¼¸ÖÖÑÕɫͨ¹ý»òÔËËã×éºÏ£¬×éºÏºó»¹ÊÇÔÚÕâ16ÖÖÑÕÉ«ÖÐ # Windows CMDÃüÁîÐÐ ×ÖÌåÑÕÉ«¶¨Òå text colors FOREGROUND_BLACK = 0x00 # black. FOREGROUND_DARKBLUE = 0x01 # dark blue. FOREGROUND_DARKGREEN = 0x02 # dark green. FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue. FOREGROUND_DARKRED = 0x04 # dark red. FOREGROUND_DARKPINK = 0x05 # dark pink. FOREGROUND_DARKYELLOW = 0x06 # dark yellow. FOREGROUND_DARKWHITE = 0x07 # dark white. FOREGROUND_DARKGRAY = 0x08 # dark gray. FOREGROUND_BLUE = 0x09 # blue. FOREGROUND_GREEN = 0x0a # green. FOREGROUND_SKYBLUE = 0x0b # skyblue. FOREGROUND_RED = 0x0c # red. FOREGROUND_PINK = 0x0d # pink. FOREGROUND_YELLOW = 0x0e # yellow. FOREGROUND_WHITE = 0x0f # white. # Windows CMDÃüÁîÐÐ ±³¾°ÑÕÉ«¶¨Òå background colors BACKGROUND_BLUE = 0x10 # dark blue. BACKGROUND_GREEN = 0x20 # dark green. BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue. BACKGROUND_DARKRED = 0x40 # dark red. BACKGROUND_DARKPINK = 0x50 # dark pink. BACKGROUND_DARKYELLOW = 0x60 # dark yellow. BACKGROUND_DARKWHITE = 0x70 # dark white. BACKGROUND_DARKGRAY = 0x80 # dark gray. BACKGROUND_BLUE = 0x90 # blue. BACKGROUND_GREEN = 0xa0 # green. BACKGROUND_SKYBLUE = 0xb0 # skyblue. BACKGROUND_RED = 0xc0 # red. BACKGROUND_PINK = 0xd0 # pink. BACKGROUND_YELLOW = 0xe0 # yellow. BACKGROUND_WHITE = 0xf0 # white. # get handle std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) def set_cmd_text_color(color, handle=std_out_handle): Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color) return Bool #reset white def resetColor(): set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) return #°µºìÉ« #dark red def printDarkRed(mess): set_cmd_text_color(FOREGROUND_DARKRED) sys.stdout.write(mess) resetColor() return #ºìÉ« #red def printRed(mess, newLine=True): set_cmd_text_color(FOREGROUND_RED) sys.stdout.write(mess) if newLine: sys.stdout.write("\n") resetColor() return #################################################################################################### cfg = ConfigParser.ConfigParser() if os.path.exists("config2.ini"): cfg.read("config2.ini") else: cfg.read("config.ini") ClientRootPath = cfg.get("config", "ClientRootPath") ServerRootPath = cfg.get("config", "ServerRootPath") print "ClientRootPath: %s" % ClientRootPath print "ServerRootPath: %s" % ServerRootPath ClientRootPathList = [ClientRootPath] for i in xrange(1, 6): if not cfg.has_option("config", "ClientRootPath%s" % i): break ClientRootPathEx = cfg.get("config", "ClientRootPath%s" % i) ClientRootPathList.append(ClientRootPathEx) ServerRootPathList = [ServerRootPath] for i in xrange(1, 6): if not cfg.has_option("config", "ServerRootPath%s" % i): break serverRootPathEx = cfg.get("config", "ServerRootPath%s" % i) ServerRootPathList.append(serverRootPathEx) if len(ServerRootPathList) > 1: print "ServerRootPathList: %s" % ServerRootPathList ExportSign = ["C", "G", "S", "M", ""] def GetExportSign(value): exportSign = "" upperSign = value.upper().replace(" ", "") for s in upperSign: if s not in ExportSign or s in exportSign: return None exportSign += s return upperSign Encoding = "gbk" EncodingSpec = eval(cfg.get("config", "EncodingSpec")) def DoExportCfgFile(fileName, exportInfo): encoding = Encoding for e, f in EncodingSpec.items(): if fileName in f: encoding = e break sys.setdefaultencoding(encoding) print "----------------------------" filePath = exportInfo[0] clientPath = exportInfo[1] clientFileName = exportInfo[2] serverPath = exportInfo[3] serverFileName = exportInfo[4] pkInfo = exportInfo[5] exportContent = __GetFileExportContent(filePath, pkInfo) if not exportContent: return gServerCfg, mServerCfg, serverCfg, clientCfg = exportContent if not gServerCfg and not mServerCfg and not serverCfg and not clientCfg: printRed("ÅäÖÃÎļþÎÞЧ£¡%s" % (filePath)) return print "¿ªÊ¼µ¼±í: %s" % filePath # unicodeÖеġ®\xa0¡¯×Ö·ûÔÚת»»³Égbk±àÂëʱ»á³öÏÖÎÊÌ⣬gbkÎÞ·¨×ª»»'\xa0'×Ö·û # ËùÒÔ£¬ÔÚת»»µÄʱºò±ØÐè½øÐÐһЩǰÖö¯×÷ string.replace(u'\xa0', u' ') if gServerCfg: for ServerRootPath in ServerRootPathList: gServerCfgName = ServerRootPath + "\CoreServerGroup\GameServer\PySysDB" + "\%s.txt" % serverFileName fp = open(gServerCfgName, "w") for c in gServerCfg: fp.write("%s\n" % (c.replace(u'\xa0', u' '))) fp.close() print "µ¼³öGameServer: %s" % gServerCfgName if mServerCfg: for ServerRootPath in ServerRootPathList: mServerCfgName = ServerRootPath + "\db\PyMongoDataServer\PySysDB" + "\%s.txt" % serverFileName fp = open(mServerCfgName, "w") for c in mServerCfg: fp.write("%s\n" % (c.replace(u'\xa0', u' '))) fp.close() print "µ¼³öMapServer: %s" % mServerCfgName if serverCfg: for ServerRootPath in ServerRootPathList: serverCfgName = ServerRootPath + serverPath + "\%s.txt" % serverFileName fp = open(serverCfgName, "w") for c in serverCfg: fp.write("%s\n" % (c.replace(u'\xa0', u' '))) fp.close() print "µ¼³ö·þÎñ¶Ë: %s" % serverCfgName if clientCfg: for ClientRootPath in ClientRootPathList: sys.setdefaultencoding("utf8") # ǰ¶ËĬÈϱàÂë clientCfgName = ClientRootPath + clientPath + "\%s.txt" % clientFileName fp = open(clientCfgName, "w") for c in clientCfg: fp.write("%s\n" % (c.replace(u'\xa0', u' '))) fp.close() print "µ¼³ö¿Í»§¶Ë: %s" % clientCfgName return True def __GetFileExportContent(filePath, pkInfo): gServerCfg = [] mServerCfg = [] serverCfg = [] clientCfg = [] gServerCfgColList = [] # gameServer·þÎñ¶ËÅäÖÃËùÐèÒªµÄÁÐË÷ÒýÁбí mServerCfgColList = [] # mapServer·þÎñ¶ËÅäÖÃËùÐèÒªµÄÁÐË÷ÒýÁбí - ¶îÍâµÄ serverCfgColList = [] # ·þÎñ¶ËÅäÖÃËùÐèÒªµÄÁÐË÷ÒýÁбí clientCfgColList = [] # ¿Í»§¶ËÅäÖÃËùÐèÒªµÄÁÐË÷ÒýÁбí gServerCfgRowList = [] # gameServer·þÎñ¶ËÅäÖÃËùÐèÒªµÄÐÐË÷ÒýÁбí mServerCfgRowList = [] # mapServer·þÎñ¶ËÅäÖÃËùÐèÒªµÄÐÐË÷ÒýÁбí - ¶îÍâµÄ serverCfgRowList = [] # ·þÎñ¶ËÅäÖÃËùÐèÒªµÄÐÐË÷ÒýÁбí clientCfgRowList = [] # ¿Í»§¶ËÅäÖÃËùÐèÒªµÄÐÐË÷ÒýÁбí data = xlrd.open_workbook(filePath) table = data.sheet_by_index(0) # ĬÈÏÖ»½âÎöµÚÒ»ÕŹ¤×÷±í nrows = table.nrows # ÐÐÊý ncols = table.ncols # ÁÐÊý if not nrows or not ncols: printRed("ÅäÖÃÎļþÎÞÊý¾Ý£¡%s" % (filePath)) return # ÕÒ³öÐèÒªµ¼³öµÄÁÐ, SCÅäÖÃÐèÒª×ö¾«È·Æ¥Åä firstRowValuesList = table.row_values(0) # µÚÒ»ÐÐ for col, value in enumerate(firstRowValuesList): if not (isinstance(value, unicode) or isinstance(value, str)): continue upperValue = GetExportSign(value) if upperValue == None: continue if "G" in upperValue: gServerCfgColList.append(col) if "M" in upperValue: mServerCfgColList.append(col) if "S" in upperValue: serverCfgColList.append(col) if "C" in upperValue: clientCfgColList.append(col) # ÕÒ³öÐèÒªµ¼³öµÄÐÐ, SCÅäÖÃÐèÒª×ö¾«È·Æ¥Åä firstColValuesList = table.col_values(0) # µÚÒ»ÁÐ for row, value in enumerate(firstColValuesList): if not (isinstance(value, unicode) or isinstance(value, str)): continue upperValue = GetExportSign(value) if upperValue == None: continue if "G" in upperValue: gServerCfgRowList.append(row) if "M" in upperValue: mServerCfgRowList.append(row) if "S" in upperValue: serverCfgRowList.append(row) if "C" in upperValue: clientCfgRowList.append(row) # ×î¶àÖ»µ¼Ò»Áеģ¬ÕâÖÖ±íµÚÒ»ÁÐΪµ¼³öÐÐÅäÖà if ncols > 1 and (not gServerCfgColList or gServerCfgColList == [0]) and (not mServerCfgColList or mServerCfgColList == [0]) \ and (not serverCfgColList or serverCfgColList == [0]) and (not clientCfgColList or clientCfgColList == [0]): gServerCfgColList = [] mServerCfgColList = [] serverCfgColList = [] clientCfgColList = [] # ×î¶àÖ»µ¼Ò»Ðеģ¬ÕâÖÖ±íµÚÒ»ÐÐΪµ¼³öÁÐÅäÖà if (not gServerCfgRowList or gServerCfgRowList == [0]) and (not mServerCfgRowList or mServerCfgRowList == [0]) \ and (not serverCfgRowList or serverCfgRowList == [0]) and (not clientCfgRowList or clientCfgRowList == [0]): gServerCfgRowList = [] mServerCfgRowList = [] serverCfgRowList = [] clientCfgRowList = [] # 1-µÚÒ»ÐÐΪµ¼³öSCÅäÖã»2-µÚÒ»ÁÐΪµ¼³öSCÅäÖã»3-µÚÒ»ÐÐÁоùΪµ¼³öSCÅäÖà if (gServerCfgColList or mServerCfgColList or serverCfgColList or clientCfgColList) \ and (gServerCfgRowList or mServerCfgRowList or serverCfgRowList or clientCfgRowList): exportType = 3 # ÐÐÁе¼³ö£¬Ê×ÐÐÊ×ÁÐΪµ¼³öÅäÖà elif gServerCfgColList or mServerCfgColList or serverCfgColList or clientCfgColList: exportType = 1 # °´Áе¼³ö£¬Ê×ÐÐΪµ¼³öÅäÖà elif gServerCfgRowList or mServerCfgRowList or serverCfgRowList or clientCfgRowList: exportType = 2 # °´Ðе¼³ö£¬Ê×ÁÐΪµ¼³öÅäÖà # µ±½öÊ×ÁÐΪSCÅäÖÃʱ£¬µ¼³öµÄÁÐΪ³ýÁËÊ×ÁÐÍâµÄÈ«²¿ gServerCfgColList = range(1, ncols) mServerCfgColList = range(1, ncols) serverCfgColList = range(1, ncols) clientCfgColList = range(1, ncols) else: printRed('Îļþµ¼³ö¿Í»§¶Ë·þÎñ¶ËSCÅäÖôíÎ󣡽ö¿ÉÒÔÉ趨%sÖеÄÒ»ÖÖ»ò¶àÖÖ×éºÏ£¡' % ExportSign) return isFirstRowSC = exportType in [1, 3] # Ê×ÐÐÊÇ·ñSCµ¼³öÅäÖà cfgKeyList = [] # ËùÓÐÅäÖÃÊý¾ÝµÄÖ÷¼ükeyÁбí, ÓÃÓÚÅжÏÊÇ·ñÖØ¸´key pkFormat = "" pkColList = [] # Ö÷¼ü×éºÏ×Ö¶ÎÁÐË÷Òý pkList = pkInfo.split("|") for i, pk in enumerate(pkList): pkList[i] = pk.upper() # ×Ö¶ÎÃûÐÐ fieldRow = 2 if isFirstRowSC else 1 fieldRowValuesList = table.row_values(fieldRow) # ×Ö¶ÎÃûÐÐ for col, value in enumerate(fieldRowValuesList): if value.upper() in pkList: pkColList.append(col) pkFormat += "%s=%%s, " % value # µ±ÐÐΪSCÅäÖÃʱ, ·þÎñ¶ËÌØÊâÐбàºÅ1,3Ðв»µ¼£» ÁÐΪSCÅäÖÃʱ£¬ÓÉÁÐÖ±½ÓÅäÉÏÈ¥, ÕâÀï¾Í²»ÔÙ×ö´¦Àí serverIgnoreRow = [1, 3] if isFirstRowSC else [] # gameServerͨÓà gServerFormat = "%s" + "\t%s"*(len(gServerCfgColList) - 1) mServerFormat = "%s" + "\t%s"*(len(mServerCfgColList) - 1) serverFormat = "%s" + "\t%s"*(len(serverCfgColList) - 1) clientFormat = "%s" + "\t%s"*(len(clientCfgColList) - 1) for row in xrange(nrows): # Ê×ÐÐΪSCÅäÖÃʱ²»µ¼ if row == 0 and isFirstRowSC: continue rowValuesList = table.row_values(row) # ¸¡µãÐÍתΪint for i, v in enumerate(rowValuesList): if type(v) != float: continue #ÓÅÏÈʹÓÃת×Ö·û´®ºóÔÙÈ¡Õû£¬·ÀÖ¹ÒòΪ¾«¶Èµ¼ÖµÄСÊýÎÊÌâ strV = str(v) if strV.endswith(".0"): strV = strV[:-2] rowValuesList[i] = int(strV) continue intV = int(v) if intV == v: rowValuesList[i] = intV isAdd = False if (exportType == 1 or row in gServerCfgRowList) and row not in serverIgnoreRow and gServerCfgColList: isAdd = True gServerCfg.append(gServerFormat % tuple([rowValuesList[i] for i in gServerCfgColList])) if (exportType == 1 or row in mServerCfgRowList) and row not in serverIgnoreRow and mServerCfgColList: isAdd = True mServerCfg.append(mServerFormat % tuple([rowValuesList[i] for i in mServerCfgColList])) if (exportType == 1 or row in serverCfgRowList) and row not in serverIgnoreRow and serverCfgColList: isAdd = True serverCfg.append(serverFormat % tuple([rowValuesList[i] for i in serverCfgColList])) if (exportType == 1 or row in clientCfgRowList) and clientCfgColList: isAdd = True # Ìæ»»µ¼³öµ½¿Í»§¶ËÓõĹ«Ê½ÔËËã·û for col, cfgStr in enumerate(rowValuesList): cfgFormula = __RepalceClientCfgFormula(cfgStr) if cfgFormula is None: printRed("Ìæ»»¹«Ê½Ê§°Ü£¡µÚ%sÐУ¬µÚ%sÁС£" % (row + 1, col + 1)) return rowValuesList[col] = cfgFormula if row == 3: # ˵Ã÷ÐУ¬Ìæ»»»»Ðзû£¬·Àֹǰ¶Ë¼ÓÔØ±í¸ñ±¨´í clientCfg.append(clientFormat % tuple([rowValuesList[i].replace("\r", "").replace("\n", "") for i in clientCfgColList])) else: clientCfg.append(clientFormat % tuple([rowValuesList[i] for i in clientCfgColList])) if isAdd and pkColList: cfgKey = pkFormat % tuple([rowValuesList[pkCol] for pkCol in pkColList]) if cfgKey in cfgKeyList: printRed("%s KeyÖØ¸´£º%s, µÚ%sÐС£" % (filePath, cfgKey, row + 1)) return cfgKeyList.append(cfgKey) return gServerCfg, mServerCfg, serverCfg, clientCfg def __RepalceClientCfgFormula(formula): # Ìæ»»µ¼³öµ½¿Í»§¶ËÓõĹ«Ê½, Ö»×öÔËËã·ûÌæ»»¼´¿É if type(formula) not in [str, unicode]: return formula if "(" not in formula and ")" not in formula: return formula if u"£¨" in formula or u"£©" in formula: printRed("¹«Ê½ÖÐÇëʹÓÃÓ¢ÎÄÀ¨ºÅ: %s" % formula) return #print "³õʼ: len=%s, %s" % (len(formula), formula) formula = formula.replace(" ", "") formula = formula.replace("random.random()", "(0;1)") start = 0 doCnt = 0 while doCnt < 1000: doCnt += 1 #print " %s, %s" % (start, formula) right = formula.find(")", start) if right == -1: if "min(" in formula or "max(" in formula or "math.ceil(" in formula or "int(" in formula \ or "math.sqrt(" in formula or "pow(" in formula or "random.randint(" in formula: start = 0 # ´ÓÍ·¿ªÊ¼ continue else: #print "ûÓпÉÌæ»»µÄÔËËã·ûÁË" break f = None if f == None: f = __DoReplacePyFunc(formula, right, "min(", 2, "{<[%s!%s]>}") if f == None: f = __DoReplacePyFunc(formula, right, "max(", 2, "{<[%s@%s]>}") if f == None: f = __DoReplacePyFunc(formula, right, "random.randint(", 2, "{<[%s~%s]>}") # ÐèÔÚint֮ǰ´¦Àí if f == None: f = __DoReplacePyFunc(formula, right, "int(", 1, "{<[%s#]>}") if f == None: f = __DoReplacePyFunc(formula, right, "math.ceil(", 1, "{<[%s$]>}") if f == None: f = __DoReplacePyFunc(formula, right, "math.sqrt(", 1, "{<[%s&]>}") if f == None: f = __DoReplacePyFunc(formula, right, "pow(", 2, "{<[%s^%s]>}") # ¶¼ÕÒ²»µ½Æ¥ÅäµÄº¯ÊýÇé¿öÏ£¬¾ÍÊÇ´¿´âµÄ()À¨ÆðÀ´¼ÓÇ¿ÔËËãÓÅÏȼ¶µÄ£¬ÏÈÌæ»»Îª{<[]>}£¬Ö®ºóÔÙͳһ»»»ØÈ¥ if f == None: f = __DoReplacePyFunc(formula, right, "(", 1, "{<[%s]>}") if f != None: formula = f start = right + 1 if doCnt >= 1000: printRed("Ìæ»»¹«Ê½Ö´ÐдÎÊýÒì³£: %s" % formula) return formula = formula.replace("{<[", "(") formula = formula.replace("]>}", ")") #print "Ìæ»»½á¹û: %s" % formula return formula def __DoReplacePyFunc(formula, right, funcStr, funcParamCnt, replaceStr): ## Ìæ»»pyÔËË㺯ÊýΪ¿Í»§¶Ë¿ÉÓøñʽ left = formula.rfind(funcStr, 0, right) # ´ÓºóÍùǰÕÒ³öµÚÒ»¸öÆ¥ÅäµÄº¯Êý if left == -1: return pyFuncStr = formula[left:right + 1] paramStr = pyFuncStr[len(funcStr):-1] if "(" in paramStr or ")" in paramStr: #print " º¯Êý²ÎÊýÄÚÈÝÀïÓжàÓàÀ¨ºÅ²»´¦Àí: %s, %s" % (pyFuncStr, paramStr) return # ûÓвÎÊýµÄpyº¯ÊýÔÚ¿ªÊ¼Ö±½Ó¾«×¼Ìæ»»£¬Èç random.random() if funcParamCnt == 2: commaIndex = paramStr.find(",") # ¶ººÅË÷Òý return formula.replace(pyFuncStr, replaceStr % (paramStr[:commaIndex], paramStr[commaIndex + 1:])) elif funcParamCnt == 1: return formula.replace(pyFuncStr, replaceStr % paramStr) return def Main(): print 'Number of arguments:', len(sys.argv), 'arguments.' # ÔªËØ0Ϊ×ÔÉíÄ£¿éÃû£¬²»´¦Àí£¬´ÓÔªËØ1¿ªÊ¼´¦Àí reload(sys) sys.setdefaultencoding(Encoding) exportDict = {} for filePath in sys.argv[1:]: fileBaseName = os.path.basename(filePath) # ÎļþÃû£¬º¬À©Õ¹Ãû fileExtension = os.path.splitext(filePath)[-1] # À©Õ¹Ãû fileName = fileBaseName.replace(fileExtension, "") # ²»º¬À©Õ¹Ãû # Ö»´¦ÀíexcelÎļþ if "xls" not in fileExtension: printRed("²»´¦Àí¸ÃÎļþ,ÔÝʱֻµ¼excelÎļþ£¡%s" % filePath) continue exportDict[fileName] = filePath clientFileNameList = [] serverFileNameList = [] exportInfoDict = {} exportMapFile = open("TableExportMap.txt", 'r') for line in exportMapFile.readlines(): #if not exportDict: # break exportMapInfo = line.split('\t') fileName = exportMapInfo[0] clientFileName = exportMapInfo[2] serverFileName = exportMapInfo[4] if clientFileName in clientFileNameList: printRed("µ¼³öǰ¶ËÎļþÃûÖØ¸´£¡%s -> %s" % (fileName, clientFileName)) return if clientFileName and clientFileName != "-": clientFileNameList.append(clientFileName) if serverFileName in serverFileNameList: printRed("µ¼³ö·þÎñ¶ËÎļþÃûÖØ¸´£¡%s -> %s" % (fileName, serverFileName)) return if serverFileName and serverFileName != "-": serverFileNameList.append(serverFileName) if fileName not in exportDict: continue filePath = exportDict.pop(fileName) exportInfoDict[fileName] = [filePath] + exportMapInfo[1:] exportMapFile.close() if exportDict: for filePath in exportDict.values(): printRed("ÇëÅäÖÃÅäÖÃ±íµ¼³ö·¾¶£¡%s" % filePath) return exportCount = 0 for fileName, exportInfo in exportInfoDict.items(): if not DoExportCfgFile(fileName, exportInfo): printRed("µ¼±íʧ°Ü! %s" % fileName) break exportCount += 1 print "----------------------------" print "³É¹¦µ¼±íÊý: %s" % exportCount print "----------------------------" return if __name__ == "__main__": Main()