2011-04-29 85 views
0

我有一个python脚本,我一直在拼凑(我的第一个python搜索之一)。如何在python中递归树时跳过.hg/.git/.svn目录

该脚本递归寻找XCode项目文件的文件夹;该脚本工作正常,但我想适应它跳过任何.svn(或.hg或.git)文件夹,以便它不试图修改源存储库。

下面是递归搜索

for root, dirnames, files in os.walk('.'): 
    files = [f for f in files if re.search("project\.pbxproj", f)] 
    for f in files: 
     filename = os.path.join(root, f) 
     print "Adjusting BaseSDK for %s" % (filename) 
     ... 

,如何排除库子树的脚本?

+8

你看过os.walk文档吗? http://docs.python.org/library/os.html#os.walk。确切的解决方案在文档中。 'dirnames.remove(“。svn”)' – 2011-04-29 22:17:49

+0

刚刚遇到这里,因为我想删除项目中的所有.svn文件,命令[svn export](http://svnbook.red-bean.com/en/ 1.5/svn.ref.svn.c.export.html)只是在不需要脚本的情况下执行此操作(在hg&git中,项目的根目录中只有一个文件夹需要删除)。 – moritz 2011-04-29 23:06:04

+0

@ S.Lott感谢您指出文档中的位置;不知道为什么我错过了它。 – 2011-04-30 19:57:51

回答

5

由于美国洛特说,在他的评论中,这是os.walk文档中提及。以下应该工作得很好:

for root, dirs, files in os.walk("."): 
    if ".hg" in dirs: 
     dirs.remove(".hg") 
    for f in files: 
     print os.path.join(root, f) 
0

在处理文件之前,可以检查文件名中的第一个字符是否以“。”开头,如果是,则继续循环中的下一个项目。

for root, dirnames, files in os.walk('.'): 
    files = [f for f in files if re.search("project\.pbxproj", f)] 
    for f in files: 
     ### EDIT START 
     if f[0] == ".": 
      continue 
     ### EDIT FINISH 

     filename = os.path.join(root, f) 
     print "Adjusting BaseSDK for %s" % (filename) 
+0

.hg,.git,.svn是文件夹。另请参阅上述问题的评论。 – manojlds 2011-04-29 22:38:08