2016-04-06 99 views
0

我會把我的一些代碼咆哮來解釋這個問題,但基本上我正在嘗試做一個函數內比較 - 一個字符串&只包含一行那個字符串。Python比較兩個相同的字符串返回與假

我有名單如下:

org_tasks = ['general_static ', 'host_general_static ',etc....] 

這我傳遞一個文件名功能(Python文件)

my_dict = createDictFromTaskList(ref_ver, org_tasks) 

def createDictFromTaskList(prm_fl,tasks_list): 
    final_dict = {} 
    for task in tasks_list: 
     print getTransformedDic(prm_fl, str('CurrentTaskParams.' + task)) 
    return final_dict 

的呼叫:

def getTransformedDic(prm_fl,dic_name): # transforms string to dictionary 
    "turns dictionary values from type variable into a string" 
    newDic = "" 
    dicToChange = getOldDicAsString(prm_fl,dic_name) 
    if dicToChange is None: return None 
    dicToChange = dicToChange[len(dic_name) + 3:] #here i get none for some reason 
    dicToChange = dicToChange.replace('"', "'") 
    for line in dicToChange.splitlines(): 
     transformedLine = ''.join(line.split()) 
     transformedLine = transformedLine.strip() 
     if transformedLine.startswith('#'): continue 
     IsLineBelongsToDic = transformedLine.split(':') 
     if len(IsLineBelongsToDic) > 1: 
      if transformedLine[-1:] == ",": 
       valueAsString = '"%s",' % transformedLine[len(IsLineBelongsToDic[0]) + 1:-1] 
      else: 
       valueAsString = '"%s",' % transformedLine[len(IsLineBelongsToDic[0]) + 1:] 
      line = ' ' + IsLineBelongsToDic[0] + ' : ' + valueAsString 
     newDic += '%s' % line + '\n' 
    try: 
     value = ast.literal_eval(newDic[:-1]) 
    except SyntaxError: 
     return None 
    else: 
     return value 


def getOldDicAsString(prm_fl, dic_name): 
    "return a string that contains dictionary" 
    with open(prm_fl) as f: 
     file_data = f.read() 
    recordLines = False 
    dictionary = "" 
    for line in file_data.splitlines(): 
     transformedLine = ''.join(line.split()) 
     transformedLine = transformedLine.strip() 
     taskName = transformedLine.split('=')[0] 
     print taskName ,dic_name # here i can see they are the same 
     if taskName == dic_name or recordLines: 
      recordLines = True 
      dictionary += line + '\n' 
      if transformedLine == "}": 
       return dictionary 

的文件我看起來如下(根據我之前提到的名單):

... 
CurrentTaskParams.general_static = { 
    'is_enable'   :   'true' 
} 
CurrentTaskParams.host_general_static = { 
    'is_enable'   :   'true' 
} 
... 

加入一些打印完畢後,我已經看到了,當例如我比較

CurrentTaskParams.general_static

- >這是作爲參數

傳遞到線包含此字符串(在從空格&'{'&'=') 條帶化後我不添加字典字符串(意思是我的'if'返回false)

任何幫助將很大, 謝謝!

+0

通過一個簡單的例子和​​一個更簡潔的問題,更容易得到答案。我建議你編輯一個簡單的問題 – Francesco

+0

當'recordLines'總是'False'時,if taskName == dic_name或recordLines:'的目的是什麼? – mfitzp

+1

'org_tasks'列表字符串末尾的空格是否也存在於您的腳本中,或僅僅是這篇文章中的錯誤?你應該刪除它,因爲你是從文件的行中刪除所有的空間 – Francesco

回答

0

下面的小例子,複製源數據和您的代碼塊:

file_data = """ 
CurrentTaskParams.general_static = { 
    'is_enable'   :   'true' 
} 
CurrentTaskParams.host_general_static = { 
    'is_enable'   :   'true' 
} 
""" 

dic_name = 'CurrentTaskParams.general_static' 

for line in file_data.splitlines(): 
    transformedLine = ''.join(line.split()) 
    transformedLine = transformedLine.strip() 
    taskName = transformedLine.split('=')[0] 
    print("'%s'" % taskName, "'%s'" % dic_name, taskName == dic_name) 

運行這一點,正確地拿起這行:

'' 'CurrentTaskParams.general_static' False 
'CurrentTaskParams.general_static' 'CurrentTaskParams.general_static' True 
''is_enable':'true'' 'CurrentTaskParams.general_static' False 
'}' 'CurrentTaskParams.general_static' False 
'CurrentTaskParams.host_general_static' 'CurrentTaskParams.general_static' False 
''is_enable':'true'' 'CurrentTaskParams.general_static' False 
'}' 'CurrentTaskParams.general_static' False 

隨着工作的例子也很難調試問題(!),但我懷疑這意味着問題在別的地方。

在您的示例代碼中,您列出了仍然存在尾隨空格的組織任務,這是故意的嗎?

org_tasks = ['general_static ', 'host_general_static ',etc....] 

我建議你嘗試打印您認爲是匹配的,但包裹在引號(見上文),因爲這將有助於更好地突出任何前/後間隔在你的字符串中的數據。

+0

實際上空間不應該在那裏,&刪除後 - 解決問題! – Lev