替换python中的路径的开头

时间:2014-10-12 15:14:21

标签: python

我有一个包含很多路径的文件,所有这些路径都包含一个名为“work”的目录。 示例:

c:\files\work\1998\march
d:\work\april
c:\documents\docs\work\mywork

我想用工作目录替换特定路径之前的所有子路径,比方说"c:\idan"。意思是结果将是:

c:\idan\work\1998\march
c:\idan\work\april
c:\idan\work\mywork

我如何在Python中这样做? 我尝试使用re.sub函数但没有任何成功。

1 个答案:

答案 0 :(得分:1)

您可以使用str.find获取每个文件路径中\work\部分的索引。然后,您可以将该索引用于slice the string到以\work\…开头的子字符串。然后你只需要添加你的公共前缀。

>>> paths = [r'c:\files\work\1998\march', r'd:\work\april', r'c:\documents\docs\work\mywork']
>>> for path in paths:
        newPath = r'c:\idan' + path[path.find('\\work\\'):]
        print(newPath)

c:\idan\work\1998\march
c:\idan\work\april
c:\idan\work\mywork

对于更复杂的路径操作,您应该查看os.path模块,该模块专门针对它。例如,您可以使用os.path.join使用当前操作系统的正确路径分隔符自动连接两个路径组件:

newPath = os.path.join(r'c:\idan', path[path.find('\\work\\') + 1:])

但是,由于您只是在受限制的环境中进行基本路径操作(您将路径作为字符串,您知道它们包含\work\并且您只想添加不同的前缀),使用基本字符串操作,如图所示上面的内容要简单得多,并且在非Windows系统上也能产生正确的结果。


  

我的主要问题是我不知道如何检索路径,因为它们在随机位置出现在文件中,有时在一行中出现多次。我使用open(file).read()将文件的文本作为字符串,但现在我需要一种方法来替换所有出现的事件。我试图创建一个适合但到目前为止没有成功的正则表达式。

识别文件路径并不那么简单,因为可能存在一些我们必须检查的特殊情况。如果我们可以缩小我们对有趣路径的规范,我们可以想出一些简单的东西。因此,我们假设我们感兴趣的所有路径都以驱动器号开头(因此没有网络路径等),是带有反斜杠作为路径分隔符的Windows路径,文件夹名称中不包含空格,并以尾随空格结束。

>>> import re
>>> newText = re.sub(r'[a-z]:(?:\\\S+)*\\work\\(\S+)', r'c:\idan\\\1', text)

>>> print(text)
Foo bar c:\files\work\1998\march and d:\work\april
baz bar
c:\documents\docs\work\mywork
>>> print(newText)
Foo bar c:\idan\1998\march and c:\idan\april
baz bar
c:\idan\mywork

正则表达式查找驱动器号,后跟冒号和任意数量的路径段。然后它在某个时刻需要\work\并捕获之后不是空白的所有内容。在替换中,是以c:\idan\为前缀的文本。