Python - 列出目录中文件的fnmatch函数保留了以前的内容

时间:2014-03-26 17:54:53

标签: python

我试图获取特定格式的某个目录(及其子目录)中的所有文件。

我找到了一个可以帮助我here的代码,如下所示:

from fnmatch import fnmatch
import os, os.path

def print_fnmatches(pattern, dir, files):
    for filename in files:
    if fnmatch(filename, pattern):
        print os.path.join(dir, filename)

os.path.walk('/', print_fnmatches, '*.mp3')

我改变了一点以满足我的需要。我创建了一个新模块,这些是它的内容:

from fnmatch import fnmatch
import os.path

filestotag = []

def listoffilestotag(path):
    os.path.walk(path, fnmatches, '*.txt')
    return filestotag

def fnmatches(pattern, direc, files): 
    for filename in files:
        if fnmatch(filename, pattern):
            filestotag.append(os.path.join(direc, filename)) 

从另一个模块,我可以调用listoffilestotag(),它可以正常工作。

然而,当我第二次打电话时,似乎' filestotag'保留以前的内容。为什么?我怎么能解决这个问题?请注意,我并不完全理解我写的实施......

谢谢!

2 个答案:

答案 0 :(得分:2)

在您的代码中,您正在更新一个全局变量,因此每次调用该函数实际上都会再次更新同一个列表并使用agian。最好将本地列表传递给fnmatches

from fnmatch import fnmatch
from functools import partial
import os.path

def listoffilestotag(path):
    filestotag = []
    part = partial(fnmatches, filestotag)
    os.path.walk(path, part, '*.txt')
    return filestotag

def fnmatches(lis, pattern, direc, files):
    for filename in files:
        if fnmatch(filename, pattern):
            lis.append(os.path.join(direc, filename))

答案 1 :(得分:0)

filestotag是一个全局变量;您可以在调用listoffilestotag之前在os.path.walk初始化它。