繁体   English   中英

逃脱Windows的路径分隔符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM