2011-11-29 217 views
1

希望快速爲這一個。我有一個腳本用文件位置替換特定值。不幸的是,該位置似乎經常包含\ n或n \(因爲當前目錄位於臨時文件夾中),導致該行中斷或從行中刪除,導致文件夾位置無效。Python - n干擾

臨時目錄通常看起來像這樣。

C:\Users\Admin\AppData\Local\Temp\nsfCDAC.tmp\Firefox 

有沒有辦法阻止\ n或n \執行?任何幫助表示讚賞,這是我的行替換腳本的樣子。提前致謝!

 #Editing Prefs.fs 
     def replaceAll(file,searchExp,replaceExp): 
      for line in fileinput.input(file, inplace=1): 
       if searchExp in line: 
        line = line.replace(searchExp,replaceExp) 
       sys.stdout.write(line) 

     replaceAll(rootDir + "/Firefox/Data/prefs.js",'FirefoxAppDirHere',rootDir + "\\FirefoxApp.exe") 

編輯:

,他對這個職位評論eryksun方法完全爲我工作!非常感謝!我會將問題標記爲已解決,但您必須先發布帖子。

+0

如果這是特定於平臺的?如果是這樣,checkout [os.path](http://docs.python.org/library/os.path.html),尤其是'os.sep'。 – fncomp

+0

如果要將字符串保存到prefs.js,則應該轉義它包含的任何反斜槓:'replace('\\','\\\')'。 – eryksun

回答

2

如果您在腳本中指定目錄名稱,則應使用原始字符串文字前綴r。例如,r"C:\Users\Admin\AppData\Local\Temp\nsfCDAC.tmp\Firefox"。這將防止解釋反斜槓。

+0

我怎麼把它放在這個意義上?由於字符串以rootDir +「\\ FirefoxApp.exe」開頭,而不是開頭,有什麼我可以用str(「無論」)包裝它嗎? – user1070603

1

邁克爾·霍夫曼的解決方案是在總體上是好的,如果因爲任何原因,你需要的字符串不是要生的,你還可以添加額外的反斜槓:

"C:\Users\Admin\AppData\Local\Temp\\nsfCDAC.tmp" 

額外的反斜線保持\ -N(或任何其他特殊功能)從運行。例如(我相信,我跑在這裏下車模糊的記憶的),如果你需要「和」在裏面,你可以做一個字符串:

"blah blah blah, he said \"hi!\", and continued on, \'til he got to the road. Blah blah!" 
+0

這個想法很好,但我不能修改rootDir,因爲它是由系統設置的,具體取決於應用程序從哪裏運行。(在這種情況下,隨機命名和生成的臨時文件夾) – user1070603

2

你在內存中的字符串具有普通的反斜槓字符的更多細節。這不是偶然產生控制字符,如Python端換行的問題。但是,如果你正在寫這個到Javascript程序,那麼你必須避開反斜槓。例如:

>>> x = r"C:\Users\Admin\AppData\Local\Temp\nsfCDAC.tmp" 

>>> print(x) 
C:\Users\Admin\AppData\Local\Temp\nsfCDAC.tmp 

所以在內存中這個字符串有單個反斜槓字符。讓我們嘗試編譯並評估它作爲一個字符串:

>>> print(eval("'%s'" % x)) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "<string>", line 1 
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in 
position 2-4: truncated \UXXXXXXXX escape 

爲了解決這個問題,你可以用兩個反斜槓替換每個反斜槓:

>>> x = x.replace('\\', '\\\\') 

>>> print(x) 
C:\\Users\\Admin\\AppData\\Local\\Temp\\nsfCDAC.tmp 

>>> print(eval("'%s'" % x)) 
C:\Users\Admin\AppData\Local\Temp\nsfCDAC.tmp