【发布时间】:2012-09-18 06:39:27
【问题描述】:
我正在编写一个 Python 脚本,它接受文件路径作为字符串、解析它们、附加命令名称并构建一个列表,然后将其传递给 subprocess.Popen() 以执行。该脚本用于处理 Unix 和 Windows 文件路径,最终应该在两个系统上运行。
当我在 Unix 下运行它时,如果我提供的 Windows 路径无意中包含转义字符(例如 \Users\Administrator\bin),Python 会将嵌入的 \b 解释为退格字符。我想防止这种情况发生。
据我所知,没有函数或方法可以将字符串变量表示为原始字符串。 'r' 修饰符仅适用于字符串常量。
到目前为止,我能得到的最接近的是:
winpath = "C:\Users\Administrator\bin"
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\')
此时,winpathlist 应该包含['C:','Users','Administrator','bin'],而不是['C','Users','Administrator\x08in']。
我可以向 winpath.replace() 添加额外的调用来处理我可能得到的其他转义 -- \a、\f、\n、\r、\t、\v -- 但不是 @ 987654335@.
有没有更 Pythonic 的方式来做到这一点?
【问题讨论】:
-
您如何将值放入字符串中? Python 不应将 \b 视为转义符,除非它在字符串文字中,或者作为转义符进入字符串。 (另外,正斜杠也可以。)
-
@Wooble:现在,它通过 doctest 进入。 >>> myCommandObject.setExcecutablePath('C:\Program Files\cygwin\cdrive\bin') 其中 myCommandObject 包含命令名称(例如 'ps')、路径和参数列表。将斜杠从反斜杠更改为正斜杠不是一种选择;我的客户明确表示这是他想要的。
-
正如我所说,r 仅适用于字符串文字;它不适用于字符串变量。我将领先的 r 视为一个 kluge。无论如何,这是 doctest(或其中的一部分): >>> myCommand.setExecutablePath('C:\Program Files\cygwin\cdrive\bin') >>> myCommandList = myCommand.getLaunchList() >>> myCommandList ['C :\\\\Program Files\\\\cygwin\\\\cdrive\\\\bin\\\\ps', '-e', '-f'] >>> myCommandList[0].split(" \\\\") ['C:', 'Program Files', 'cygwin', 'cdrive', 'bin', 'ps'] 我不再收到任何错误,现在我添加了替换调用.
-
忘记感谢 Wooble 的帮助和建议。在与我的客户协商后,他选择将 Windows 路径测试从 doctest 中移出并放入单独的文件中。
标签: python escaping special-characters