从函数返回()我做错了吗?

时间:2012-04-11 09:32:22

标签: python return-value

我正在尝试遍历目录,检索该目录中以特定扩展名结尾的所有文件,并将该文件写入列表。这个列表应该在函数完成其工作后返回。

def grabFiles(source,ext):
    import fnmatch
    import os

    matches = [] #tmp var which is used to return the files matching the search mask.
    for root, dirnames, filenames in os.walk(source):   #for each folder & subfolder do:
        for filename in fnmatch.filter(filenames, ext): #and for each file found like that do:
            matches.append(os.path.join(root, filename))#append the file name&directory to the "matches" variable.
    return(matches) #return the content of matches

现在,当我使用以下命令运行时:

ext=[".caf", ".lmg", ".chr", ".cdf", ".dds", ".tif", ".mtl", ".cgf", ".cga"]

for filetype in ext:
     files= nPy.grabFiles("D:\\01_SVN\\01_DE\\trunk\\Game",filetype)
     print files

我相信应该在我的分机列表中为每个分机返回一个包含文件的列表,对吧? 相反,它为ext列表中的每个项目返回一个[]。

如果我在不使用定义的情况下触发这个东西,它就可以正常工作:/

import fnmatch
import os
source ="D:\\01_SVN\\01_DE\\trunk\\Game"  
extension = ["*.mtl","*.tif","*.chr"] 
matches = []
for filetype in extension:
    for root, dirnames, filenames in os.walk("%s" % (source)):
        for filename in fnmatch.filter(filenames, "%s" % (filetype)):
            matches.append(os.path.join(root, filename))
print matches  

我一直盯着这个看了一个多小时,我害怕我现在几乎对自己的剧本视而不见了。<我要么无法返回一个dang列表,要么我误解了返回的工作原理 - 但它应该是将匹配列表传递给一个新的var而没有问题,不是吗?

1 个答案:

答案 0 :(得分:2)

我认为您匹配.ext而不是*.ext。尝试添加星号以匹配名称,它应该有效。

def grabFiles(source,ext):
    import fnmatch
    import os

    matches = []
    for root, dirnames, filenames in os.walk(source):
        for filename in fnmatch.filter(filenames, '*' + ext):
            matches.append(os.path.join(root, filename))
    return matches

关于你的编程风格:

  • 避免重复您在评论中所做的事情。没用了
  • return是关键字,如print,而不是函数
  • 我会使用endswith而不是fnmatch.filter
  • 避免导入功能
  • 而不是source ="D:\\01_SVN\\01_DE\\trunk\\Game"使用source=r"D:\01_SVN\01_DE\trunk\Game"