修复路径中不需要的转义序列

时间:2018-05-29 06:36:56

标签: python python-3.x

我在这样的变量中有一个路径:

path = "C:\HT_Projeler\7\Kaynak\wrapped_gedizw.tif"

哪个不正确,因为它包含转义序列:

>>> path
'C:\\HT_Projeler\x07\\Kaynak\\wrapped_gedizw.tif'

如何修复此变量中的路径,使其等同于r"C:\HT_Projeler\7\Kaynak\wrapped_gedizw.tif""C:/HT_Projeler/7/Kaynak/wrapped_gedizw.tif"

我知道这个主题很常见,我在这里调查了很多问题(12等)。

添加

这是我的确切脚本:

...
basinFile = self._gv.basinFile
basinDs = gdal.Open(basinFile, gdal.GA_ReadOnly)
basinNumberRows = basinDs.RasterYSize
basinNumberCols = basinDs.RasterXSize
...

在这里self._gv.basinFile构成了我的道路。所以我不能把self._gv.basinFile

的“r”开头

2 个答案:

答案 0 :(得分:5)

如果在Python代码中插入路径,只需使用其他人建议的原始字符串。

如果相反该字符串不在您的控制范围内,那么“事后”并没有太多可以做的事情。转义序列转换不是单射的,因此,给定一个已经处理了转义序列的字符串,您不能单独“返回”。 IOW,如果有人错误地写道:

path = "C:\HT_Projeler\7\Kaynak\wrapped_gedizw.tif"

如你所示,你得到了

'C:\\HT_Projeler\x07\\Kaynak\\wrapped_gedizw.tif'

并且无法猜测“他们的意思”,因为\x07可能已被写为\7\x07\a。哎呀,任何一封信都可能最初被写成一个转义序列 - 你在{1}}中看到的那个字符串实际上可能是a

长话短说:您的来电者有责任为您提供正确的数据。一旦它被破坏就无法再回来了。

答案 1 :(得分:1)

在一般情况下,如果没有外部检查计算机上的实际路径,就无法判断路径中的字符是否正确(并且“特殊字符”的定义不是很明确;您怎么知道路径不是\0x41,无论如何转换为A?)

作为弱启发式,您可以查找特定编辑距离内的路径名称,例如。

import os
from difflib import SequenceMatcher as similarity  # or whatever

path_components = os.path.split(variable)
path = ''
for p in path_components:
    npath = os.path.join(path, p)
    if not os.path.exists(npath):
        similar = reversed(sorted([(similarity(None, x, p).ratio(), x) in os.listdir(npath)]))
        # recurse on most similar, second most similar, etc?  or something
    path = npath