2011-11-29 151 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