在Python中将SVN路径转换为本地文件系统路径
我正在用Python写一个小工具,这个工具会把在Subversion(SVN)中被修改的文件附加到一封邮件里,并在某些特定的文件夹发生变化时发送这封邮件。我使用的是pysvn这个库来访问代码仓库。
我在本地有一份文件的副本,每次运行这个工具时,我都会更新一下,看看自上次运行以来文件有没有变化。
现在我正在把SVN中的路径名转换为我本地副本中的路径名。
目前我写了以下代码来完成这个任务:
def formatPaths(self, paths):
newPaths = list()
for path in paths:
path = path[len(self.basePath):]
path = path.replace("/", "\\")
newPaths.append(path)
return newPaths
self.basePath的值大概是"/trunk/project1",我想获取的是某些特定文件夹的相对路径(比如"/trunk/project1"下的folder1)。
这样解决问题是否合适,还是说我错过了什么神奇的函数呢?
3 个回答
0
你提到的路径名称复制的具体解决方案是合理的,但你对整个问题的通用解决方案还有改进的空间。
我建议你使用 easy_install anyvc
,这是一个为 PIDA IDE 开发的库,它提供了一个统一的 Python 接口来处理版本控制系统,建议你用这个来替代:
from anyvc import Subversion
vc = Subversion('/trunk')
modified = [f.relpath for f in vc.list() if f.state != 'clean']
for f in modified:
print f.relpath # the relative path of the file to the source root
另外,我可能会把差异(diff)附在邮件里,而不是直接发送实际的文件。不过这也是你的选择。
0
嗯... 这样做就可以了:
baselen = len(self.basePath)
for path in paths:
path = path[baselen:].replace("/", "\\")
newPaths.append(path)
return newPaths
如果你愿意,可以这样做:
baselen = len(self.basePath)
return (path[baselen:].replace("/", "\\") for path in paths)
在每次循环中不计算 baselen
也是个好习惯。
3
继续使用切片操作符,但不要在循环内部改变循环变量。为了好玩,可以试试生成器表达式(或者继续使用列表推导)。
baselen = len(self.basePath)
return (path[baselen:].replace("/", "\\") for path in paths)
补充说明:`lstrip()`在这里并不相关。根据手册的说明:
str.lstrip([chars])
返回一个去掉开头字符的新字符串。如果没有提供chars或者是None,就会去掉空白字符。如果提供了且不是None,chars必须是一个字符串;这个字符串中的字符会从调用这个方法的字符串的开头被去掉。