我试图获取特定格式的某个目录(及其子目录)中的所有文件。
我找到了一个可以帮助我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'保留以前的内容。为什么?我怎么能解决这个问题?请注意,我并不完全理解我写的实施......
谢谢!
答案 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
初始化它。