[英]Escape Windows's Path Delimiter
我需要通过转义Windows路径分隔符来更改此字符串。 我自己没有定义原始字符串,因此无法在原始字符串'r'之前加上前缀。
我需要这个:
s = 'C:\foo\bar'
是这样的:
s = 'C:\\foo\\bar'
我在这里和其他地方都能找到的一切都说明了这一点:
s.replace( r'\\', r'\\\\' )
(为什么我必须对我无法想象的原始字符串中的字符进行转义)
但是打印字符串会导致这种情况。 显然,已决定重新解释修改后的字符串中的转义符:
C:♀oar
在Perl中,这将是如此简单。 如何在Python中解决此问题?
经过一堆来回的提问,实际的问题是这样的:
您有一个文件,其内容如下:
C:\foo\bar
C:\spam\eggs
您想读取该文件的内容,并将其用作路径名,并且想知道如何转义。
答案是您根本不需要做任何事情。
反斜杠序列以字符串文字形式处理,而不是从文件或input
(在3.x;在2.x中为raw_input
)中读取的字符串对象中进行处理,因此,您无需转义那些反斜杠序列。
如果您考虑一下,则无需在字符串周围添加引号即可将其转换为字符串。 这是完全一样的情况。 引号和转义的反斜杠都是字符串表示形式的一部分 ,而不是字符串本身。
换句话说,如果将示例文件另存为paths.txt
,然后运行以下代码:
with open('paths.txt') as f:
file_paths = [line.strip() for line in f]
literal_paths = [r'C:\foo\bar', r'C:\spam\eggs']
print(file_paths == literal_paths)
…它将打印出True
。
当然,如果您的文件生成不正确并且充满了这样的垃圾:
C:♀oar
然后就没有办法“转义反斜杠”,因为它们无法逃脱。 您可以尝试编写启发式代码来重建 应该存在的原始数据,但这是您能做到的最好的。
例如,您可以执行以下操作:
backslash_map = { '\a': r'\a', '\b': r'\b', '\f': r'\f',
'\n': r'\n', '\r': r'\r', '\t': r'\t', '\v': r'\v' }
def reconstruct_broken_string(s):
for key, value in backslash_map.items():
s = s.replace(key, value)
return s
但是,如果要撤消十六进制,八进制或Unicode转义序列,这将无济于事。 例如, 'C:\\foo\\x02'
和'C:\\foo\\b'
都表示完全相同的字符串,因此,如果您获得该字符串,则无法知道应该转换为哪个字符串。 这就是为什么您能做的最好的就是启发式。
不要做s.replace(anything)
。 只需在字符串文字前的右引号前加上一个r
,就可以得到一个原始字符串。 任何基于字符串替换的东西都将是一个可怕的麻烦,因为s
中实际上没有反斜杠。 您的代码中包含反斜杠,但在实际的字符串中不会变成反斜杠。
如果字符串中确实包含反斜杠,并且您希望该字符串在曾经有一个的地方都带有两个反斜杠,那么您需要这样做:
s = s.replace('\\', r'\\')
那将用两个反斜杠替换任何单个反斜杠。 但是,如果字符串在字面上以s = 'C:\\foo\\bar'
出现在源代码中,则唯一合理的解决方案是更改该行。 它已损坏,您对其余代码所做的任何操作都不会使其损坏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.