我正在编写一个递归遍历文件系统的函数,并返回使用.txt
扩展名的所有文件列表。
pass_test_func
参数只是可以运行和检查的函数(即文件大于100字节等) - nothing
函数(将其设置为默认值),只需返回其参数即可。
我的实现:
def visit(dname, pass_test_func=nothing):
directory = os.listdir(dname)
byte_list = []
for file in directory:
file_dir = os.path.join(dname, file)
if os.path.isfile(file_dir) and file_dir.lower().endswith('.txt'):
size = os.path.getsize(file_dir)
if pass_test_func(size):
byte_list.append(str(size) + ' ' + file_dir)
elif os.path.isdir(file_dir):
visit(file_dir, pass_test_func)
return byte_list
我的问题是,当我在以下行中递归调用visit
elif os.path.isdir(file_dir):
visit(file_dir, pass_test_func)
byte_list
被清除以再次清空。我知道为什么会发生这种情况,但不知道该如何解决。该列表必须在visit
的定义中定义,因此,每当我使用递归时,无论哪种权利,它都会始终重置吗?也许其他一些数据结构更适合,例如元组或词典?
您的函数返回byte_list
,因此,当您进行递归呼叫时,只需附加返回的值,而不是像当前那样将其扔掉:
elif os.path.isdir(file_dir):
byte_list += visit(file_dir, pass_test_func)
添加一个可选的参数,可以在递归情况下使用:
# Using * makes byte_list keyword-only, so it can't be passed by normal callers by accident
def visit(dname, pass_test_func=nothing, *, byte_list=None):
directory = os.listdir(dname)
# When not passed explicitly, initialize as empty list
if byte_list is None:
byte_list = []
for file in directory:
file_dir = os.path.join(dname, file)
if os.path.isfile(file_dir) and file_dir.lower().endswith('.txt'):
size = os.path.getsize(file_dir)
if pass_test_func(size):
byte_list.append(str(size) + ' ' + file_dir)
elif os.path.isdir(file_dir):
# Pass explicitly to recursive call
visit(file_dir, pass_test_func, byte_list=byte_list)
return byte_list
作为Blorgbeard建议的替代方案,由于您返回byte_list
,因此将其用于visit
呼叫,仅更改原始代码中的一行:
visit(file_dir, pass_test_func)
to:
byte_list += visit(file_dir, pass_test_func)
这会创建其他临时list
S,但这通常没什么大不了的。