2016-03-17 55 views
-1

我正在使用包含python在windows計算機上的目錄路徑的變量,因此需要將字符串文件轉換爲原始字符串(除去轉義序列)。當我使用os.getcwd()函數並使用方法.encode('string-escape')進行轉換時,一切都很好,但只要我嘗試使用硬編碼字符串做同樣的事情,它就不會工作。這是特別令人困惑的,因爲兩個對象都是相同類型(字符串),因此應該以完全相同的方式運行。 我的代碼是:使用.encode('字符串轉義')方法處理字符串的問題

import os 
dir1 = os.getcwd() 
type1 = type(dir1) 
print type1 
print dir1.encode('string-escape') 
print "\n\n" 
dir2 = "C:\Users\StaM\Desktop\brba\test1" 
type2 = type(dir2) 
print type2 
print dir2.encode('string-escape') 

而且我的輸出是:

<type 'str'> 
C:\\Users\\StaM\\Desktop\\brba\\test1 


<type 'str'> 
C:\\Users\\StaM\\Desktop\x08rba\test1 

正如你可以看到兩個對象都是同一類型但該行爲是在處理轉義序列不同。關於爲什麼會發生這種情況以及如何使其正常工作的任何想法?所有的解釋/建議/解決方案將受到高度讚賞,我真的很想了解這裏發生了什麼。 Thnx

請注意:這個問題是關於.encode()方法,而不是'r'標誌...使用'r'標誌的原始字符串不是一個選項,因爲我傳遞的變量包含目錄路徑到我的程序來構建一個更大的字符串來表示DOS命令。

+0

@JeremyBanks不幸的是原始字符串不是一個選項,因爲我將包含目錄路徑的變量傳遞到我的程序中,構造一個更大的字符串,它將用作DOS命令,格式爲os.popen。(cmd )。 – DuckSauce

+0

非原始字符串文字正在產生什麼是有效的「損壞」數據。如果你的字符串沒有損壞,他們不會產生這個結果。如果你有字符串文字,你應該可以加上'r'。如果您有字符串數據,則不需要執行任何操作。如果你只有損壞的字符串......可能會產生一個Python字符串文字轉義序列的反向映射來推斷原始字符串,但這是最後的手段。我不確定我完全理解你是如何得到這些的 - 你的Python文件是否正在生成? –

+0

@JeremyBanks對不起,我不明白你在哪裏得到這個......「腐敗」的字符串概念。原始字符串在傳遞到變量時不適當,並且可以重用來構造第二個更大的字符串。這證明了使用.encode()方法的合理性。並且沒有生成Python文件... – DuckSauce

回答

0

此行爲的原因是os.getcwd()函數返回包含雙「\」的預格式化字符串,即使預先固定爲轉義字符。如果.encode()方法後面的字符不是轉義字符,則只會附加第二個「\」。

>>> import os 
>>> dir = os.getcwd() 
>>> print "%r" %dir 
'C:\\Users\\StaM\\Desktop\\brba\\test1' 

這裏的解決方案是使用一個字典定義所有可能轉義字符,然後使用循環所討論的字符串中找到這些字符和追加一個次級「\」直接前述任何轉義字符。這應該在使用.encode()方法之前完成。 BOOM!

+0

來自'os.getcwd()'的字符串不包含雙斜槓,它只需要在非原始字符串文本中編碼爲雙斜槓,而您'用'%r'重新生成。如果你使用'print',你會看到真正的字符串,沒有雙反斜線。 –