我正在用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”下的文件夹1)。
这是解决这个问题的好方法还是我错过了一些神奇的功能?
答案 0 :(得分:2)
保持切片运算符,但不要更改循环内的循环变量。为了好玩,尝试生成器表达式(或保持listcomp)。
baselen = len(self.basePath)
return (path[baselen:].replace("/", "\\") for path in paths)
编辑:`lstrip()'与此无关。来自manual:
str.lstrip([字符])
返回删除了前导字符的字符串副本。如果省略字符或 无,删除空格字符。如果给出而不是None,则字符必须是a 串;字符串中的字符将从开头删除 string调用此方法。
答案 1 :(得分: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
也是一种很好的做法。
答案 2 :(得分: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
此外,我可能会将差异附加到电子邮件而不是实际文件。但我想这是你的选择。