2014-02-27 171 views
1

我正在閱讀從文本文件讀取註冊表的路徑。註冊表路徑是顯式地將字符串轉換爲原始字符串

 
HKEY_LOCAL_MACHINE\Software\MYAPP\6.3 

我保存這個註冊表變量:

 
REGISTRY_KEY 

然後,我脫光了HKEY_LOCAL_MACHINE部分從字符串,並嘗試讀取的鍵的值。

 
if REGISTRY_KEY.split('\\')[0] == "HKEY_LOCAL_MACHINE": 
     keyPath = REGISTRY_KEY.strip("HKEY_LOCAL_MACHINE\\") 
     try: 
      key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, keyPath) 
      value = winreg.QueryValueEx(key, "InstallPath")[0] 
     except IOError as err: 
      print(err) 

我收到以下錯誤

 
[WinError 2] The system cannot find the file specified 

但是如果我做手工像

 
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r'Software\MYAPP\6.3') 

OR

 
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,"Software\\MYAPP\\6.3") 

它的工作原理。

那麼,有什麼辦法可以使的keyPath變量要麼是原始的字符串或包含雙「\」

PS:我使用Python 3.3

+0

結束一個換行符是什麼'keyPath'你打開項使用它(嘗試打印) – cmd

+1

前「原始」字符串和轉義斜線僅用於文字輸入字符串。字符串本身不與任何一個存儲。 – mhlester

+2

是否有可能從文件中讀取的字符串包含換行符?你可以嘗試在'OpenKey'的調用中使用'keyPath.strip()'嗎? –

回答

0
  • 原始str是一種輸入字符串的方法,因此您不需要轉義特殊字符。另一種進入同一個str的方法是轉義特殊字符(黑色是其中之一)。他們會有相同的數據。所以你的問題真的沒有答案。

  • 您還在錯誤地使用strip,但對於此特定字符串無關緊要。因爲在第一個\之後的第一個字符是SS不在您的strip命令中,並且您的密鑰以一個數字結尾,也不在您的strip命令中。但你會想解決它,所以其他鍵不會被這個搞砸。你對這個字符串感到幸運。

>>> r"HKEY_LOCAL_MACHINE\Software\MYAPP\6.3".strip("HKEY_LOCAL_MACHINE\\") 
'Software\\MYAPP\\6.3' 
  • 至於你的實際問題。還有一些關於錯誤的字符串。呼叫之前,嘗試print repr(keyPath)OpenKey

編輯:貌似SylvainDefresne猜中關於字符串

0

REGISTRY_KEY.strip()呼叫沒有做什麼你認爲它在做。它不會從字符串的開頭刪除字符串HKEY_LOCAL_MACHINE\。而是從字符串的兩端以任何順序刪除字符HK,E等。這就是爲什麼當你手動輸入你想要的東西時它會工作。

至於你原來的問題,雙反斜槓是一個轉義序列,在你的字符串中產生一個反斜槓,所以沒有必要把keyPath轉換成雙斜槓。

+0

抓我的頭在它他被錯誤地使用它,而不是在這種情況下 – cmd

+1

好了這個問題,這就是爲什麼'keyPath'沒有找到,那是因爲他錯誤地生產它。 – univerio

+0

好問題,沒有足夠的信息來回答。也許它讀錯了。無論如何,嘗試使用strip命令。 – cmd