| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package PythonData  | 
| #  | 
| # @todo:PY¶Á±íÆ÷  | 
| # @author hxp  | 
| # @date 2016-01-26  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: PY¶Á±íÆ÷  | 
| #  | 
| #---------------------------------------------------------------------  | 
| """Version = 2016-01-26 15:00"""  | 
| #---------------------------------------------------------------------  | 
| #µ¼Èë  | 
| import GameWorld  | 
| import ChConfig  | 
|   | 
| import copy  | 
| import os  | 
| #---------------------------------------------------------------------  | 
| #È«¾Ö±äÁ¿  | 
|   | 
| FIELD_LINE = 1              #±ê³ö×Ö¶ÎÃûµÄÐкŠ | 
| EFFECT_START_LINE = 3       #ÓÐЧÄÚÈÝÆðʼÐкÅugOutput(str(info))  | 
|      | 
| ##ʦ籒ˈ  | 
| #  | 
| # ¶ÁÈ¡±íÊý¾Ý£¬Ö§³Ö¸÷ÖÖ½Ó¿Ú²éѯ±íÊý¾Ý£¬½Ó¿ÚÔÚÄ£¿éĩβÓÐ×¢ÊÍ  | 
| class FileData:  | 
|       | 
|     ## ¶Áȡָ¶¨µÄ±íµÄÄÚÈݲ¢±£´æÆðÀ´  | 
|     #  @param ²ÎÊý  | 
|     #  @return ·µ»ØÖµ  | 
|     #  @remarks º¯ÊýÏêϸ˵Ã÷£º  | 
|     def __init__(self, filePath, filedLine=FIELD_LINE, StartLine=EFFECT_START_LINE):  | 
|         self.fieldList = []                               #×Ö¶ÎÃûÁÐ±í  | 
|         self.lineCount = 0                                #×ÜÓÐЧÐÐÊý  | 
|         self.contentList = []                             #ÄÚÈÝÁÐ±í  | 
|           | 
|         #¶¯Ì¬ÉèÖÃÆðʼÐкÍ×Ö¶ÎÐÐ  | 
|         self.fieldLine = filedLine  | 
|         self.effectStartLine = StartLine  | 
|         self.filePath = filePath  | 
|         self.__CreateContent(self.__OpenFileData(filePath))  | 
|         return  | 
|   | 
|     ## ¶ÁÈ¡Êý¾Ý  | 
|     #  @param filePath: Îļþ  | 
|     #  @return ÎļþÄÚÈÝ  | 
|     def __OpenFileData(self, filePath):  | 
|         curPath = ChConfig.GetAppPath() + "\\" + filePath  | 
|           | 
|         if not os.path.isfile(curPath):  | 
|             GameWorld.ErrLog('δ·¢ÏÖÄ¿±êÎļþ = %s,%s' % (filePath , curPath))  | 
|             raise Exception ('δ·¢ÏÖÄ¿±êÎļþ = %s,%s' % (filePath , curPath))  | 
|           | 
|         # ÒÔ¶þ½øÖƶÁÈ¡  | 
|         fileObj = open(curPath, 'rb')  | 
|         strMsg = fileObj.read()  | 
|         fileObj.close()  | 
|         return strMsg  | 
|       | 
|       | 
|     ## Éú³ÉÄÚÈÝ×Öµä  | 
|     #  @param ²ÎÊý  | 
|     #  @return ·µ»ØÖµ  | 
|     #  @remarks º¯ÊýÏêϸ˵Ã÷£º¶ÁÎı¾ÄÚÈÝת»¯³ÉÐÐ×ÖµäµÄÁÐ±í  | 
|     def __CreateContent(self, content):  | 
|         infoList = content.split('\r\n')   #²ð·ÖÐÐ  | 
|         for i in range(len(infoList)):  | 
|             info = infoList[i]  | 
|             if not info:  | 
|                 continue  | 
|               | 
|             rowList = info.split('\t')  #ÐÐÁÐ±í£¬Ã¿Ò»ÐÐ  | 
|               | 
|             #×Ö¶ÎÃûËùÔÚÐÐ  | 
|             if i == self.fieldLine:  | 
|                 self.fieldList = rowList[:]    #×Ö¶ÎÁÐ±í  | 
|             #ÓÐЧÄÚÈÝÐÐ  | 
|             if i >= self.effectStartLine:  | 
|                 #ÐÐÄÚÈÝÁÐÊýСÓÚ×Ö¶ÎÃû¸öÊý  | 
|                 if len(rowList) != len(self.fieldList):  | 
|                     GameWorld.ErrLog("%s ÄÚÈÝÊýÓë×Ö¶ÎÊý²»ÏàµÈ, line=%s" % (self.filePath, i + 1))  | 
|                     raise Exception ("%s ÄÚÈÝÊýÓë×Ö¶ÎÊý²»ÏàµÈ, line=%s" % (self.filePath, i + 1))  | 
|                   | 
|                 rowDic = {}  #ÐÐ×Öµä  | 
|                 for j in range(len(self.fieldList)):  | 
|                     if rowList[j] == '-':  | 
|                         rowDic[self.fieldList[j]] = ''  | 
|                     else:  | 
|                         rowDic[self.fieldList[j]] = rowList[j]  | 
|                 self.contentList.append(rowDic)  #Ìí¼ÓÄÚÈÝÁÐ±í  | 
|                   | 
|         self.lineCount = len(self.contentList)  | 
|         GameWorld.Log("¼ÓÔØPY±íÊý¾Ý: %s, ÄÚÈÝÌõÊý=%s" % (self.filePath, self.lineCount))  | 
|         return  | 
|       | 
|     #================================================================================  | 
|       | 
|     ## Í¨¹ý×Öµä²éѯ  | 
|     #  @param ²ÎÊý  | 
|     #  @return ·ûºÏÌõ¼þµÄÐÐÁÐ±í  | 
|     #  @remarks º¯ÊýÏêϸ˵Ã÷£ºÍ¨¹ý×Öµä²éѯ¿ÉÒÔ°üº¬¶à¸ö²éѯÌõ¼þ  | 
|     def GetRecordByDic(self, searchDic, getRecordCnt=0):  | 
|         resultList = []  #½á¹ûÁÐ±í  | 
|           | 
|         #´«ÈëµÄ²ÎÊý²»ÊÇ×Öµä  | 
|         if type(searchDic) != type({}):  | 
|             return resultList  | 
|           | 
|         count = self.GetRecordCount()  | 
|         #±éÀúÄÚÈÝÁÐ±í  | 
|         for i in range(count):  | 
|             rowDic = self.contentList[i]  #ÐÐ×Öµä  | 
|               | 
|             isCorrectResult = True  | 
|             for key in searchDic:  | 
|                 #ÐÐ×ÖµäÀïÎÞ²éѯ×ÖµäÖеļü  | 
|                 if key not in rowDic:  | 
|                     return []  | 
|                 #²éѯ×ֶεÄÖµ²»·û  | 
|                 if searchDic[key] != rowDic[key]:  | 
|                     isCorrectResult = False  | 
|                     break  | 
|                   | 
|             #±¾ÐзûºÏ²éѯÌõ¼þ  | 
|             if isCorrectResult:  | 
|                 resultList.append(rowDic)  | 
|                 if getRecordCnt > 0 and len(resultList) >= getRecordCnt:  | 
|                     break  | 
|           | 
|         # ·µ»Ø½á¹û½øÐÐÉ±´£¬·ÀÖ¹»ù±íÊý¾Ý±»ÐÞ¸Ä  | 
|         return copy.deepcopy(resultList)  | 
|       | 
|     ## Í¨¹ýij¸ö×ֶβéѯ     | 
|     #  @param ²ÎÊý  | 
|     #  @return ·ûºÏÌõ¼þµÄÐÐÁÐ±í  | 
|     #  @remarks º¯ÊýÏêϸ˵Ã÷£ºÍ¨¹ýij¸ö×ֶεÄֵΪ¶àÉÙ½øÐеIJéѯ  | 
|     def GetRecord(self, fieldName, value, getRecordCnt=0):  | 
|         return self.GetRecordByDic({fieldName:str(value)}, getRecordCnt)  | 
|       | 
|     ## ·µ»ØÓÐЧÄÚÈÝÌõÊý  | 
|     #  @param ²ÎÊý  | 
|     #  @return ÌõÊý  | 
|     #  @remarks º¯ÊýÏêϸ˵Ã÷£º  | 
|     def GetRecordCount(self):  | 
|         return self.lineCount  | 
|       | 
|     ## Í¨¹ýË÷Òý·µ»ØÄÚÈÝ  | 
|     #  @param ²ÎÊý  | 
|     #  @return ·µ»ØÖµ  | 
|     #  @remarks º¯ÊýÏêϸ˵Ã÷£º  | 
|     def GetRecordByIndex(self, index):  | 
|         # ·µ»Ø½á¹û½øÐÐÉ±´£¬·ÀÖ¹»ù±íÊý¾Ý±»ÐÞ¸Ä  | 
|         return copy.deepcopy(self.contentList[index])  | 
|               | 
| #----------------------------½Ó¿ÚʹÓÃ˵Ã÷-------------------------------  | 
| #½Ó¿Ú£ºGetRecordByDic£¨searchDic£© Í¨¹ýÒ»¸ö×Öµä²éѯÊý¾Ý  | 
| #        ²ÎÊý£ºÒ»¸ö²éѯ×ֵ䠠È磺{'FrmName':'frmIndividualRankEx','FunctionID':'2'} ×Öµä×Öµä¿ÉÈÎÒâÌí¼Ó²éѯ×ֶΠ'TwoValue':'0'  | 
| #        ·µ»ØÖµ£º·ûºÏÌõ¼þµÄÁÐ±í£¬ÁбíÀïÊÇ·ûºÏÌõ¼þµÄÿÐÐ×Öµä  | 
| #        Ê¹Ó㺠GameRank = FileData()  | 
| #              list = GameRank.GetRecordByDic({'FrmName':'frmIndividualRankEx','FunctionID':'2'})  | 
| #              dic = list[0]  | 
| #              id = dic['FunctionID']  | 
|   | 
| #½Ó¿Ú£ºGetRecord£¨fieldName,value£© Í¨¹ý×Ö¶ÎÃûºÍ¸Ã×ֶεÄÖµ²éѯ  | 
| #        ²ÎÊý£º×Ö¶ÎÃû£¬×Ö¶ÎÖµ  È磺'FrmName','frmIndividualRankEx'  | 
| #        ·µ»ØÖµ£º·ûºÏÌõ¼þµÄÁÐ±í£¬ÁбíÀïÊÇ·ûºÏÌõ¼þµÄÿÐÐ×Öµä  | 
| #        Ê¹Ó㺠obj.GetRecord('FrmName','frmIndividualRankEx')[0]['Remark']  | 
| #  | 
| #½Ó¿Ú£ºGetRecordCount£¨£© È¡µÃÓÐЧÄÚÈÝÌõÊý  | 
| #        ·µ»ØÖµ£ºint ÄÚÈÝÌõÊý  | 
| #  | 
| #½Ó¿Ú£ºGetRecordByIndex£¨index£© Í¨¹ýË÷Òý·µ»ØÄÚÈÝ  | 
| #        ²ÎÊý£ºint Ë÷Òý  | 
| #        ·µ»ØÖµ£º¸ÃË÷ÒýÐеÄ×Öµä  | 
| #        Ê¹Ó㺠obj.GetRecordByIndex(0)['Remark']  |