我构建了以下模块,用于根据文件的大小和名称识别目录中是否存在文件,以便我可以在项目的不同部分中使用它。当我第一次尝试使用该功能时,它效果很好。但是当我再次调用它时,具有不同参数的不同变量会返回第一个答案。我错过了什么?
模块:
import os
from stat import *
import math
CORRECT_PATH = ''
FLAG = 1
def check_matching(pathname, desired_file_name):
global FLAG
if desired_file_name in pathname:
FLAG = 0
return pathname
def walktree(dirz, desired_file_name, size):
global CORRECT_PATH
global FLAG
for f in os.listdir(dirz):
try:
if FLAG:
pathname = os.path.join(dirz, f)
mode = os.stat(pathname)[ST_MODE]
if S_ISDIR(mode):
# It's a directory, recourse into it
walktree(pathname, desired_file_name, size)
elif S_ISREG(mode):
# It's a file, call the callback function
new_size = int(os.path.getsize(pathname))
if (new_size - int(size)) < math.fabs(0.95*int(size)):
CORRECT_PATH = check_matching(pathname, desired_file_name)
else:
# Unknown file type, print a message
print 'Skipping %s' % pathname
else:
try:
CORRECT_PATH = CORRECT_PATH.replace('\', '/')
return True, CORRECT_PATH
except WindowsError as w:
#print w
if w[0] == 5:
return True, CORRECT_PATH
except WindowsError as e:
pass
# print e
# if e[0] == 5:
# return True, CORRECT_PATH # add correct path now
return False, ''
现在,当我调用此代码时(这是一个示例,我正在使用两个不同的文本文件,它们的大小和名称不同,保存在我的本地计算机上(:
import LS_FINAL_FOUR
ans = LS_FINAL_FOUR.walktree("C:/", "a_test", 38)
print ans # (True, 'C:/a_test.txt')
ans1 = LS_FINAL_FOUR.walktree("C:/", "a_sample", 1000000)
print ans1 # (True, 'C:/a_test.txt')
两者都返回相同的输出。非常令人沮丧。有谁知道这背后的原因以及如何解决它?编辑:我几乎可以肯定这是模块的问题,但我只是无法确定它。
调用 walktree
时都需要将 FLAG 重置为 1。实际上,当您找到第一个文件时,FLAG 设置为零一次。每次后续调用,您都会重新访问此初始结果,因为如果 FLAG 为 false,则再次运行以下代码:
else:
try:
CORRECT_PATH = CORRECT_PATH.replace('\', '/')
return True, CORRECT_PATH
由于CORRECT_PATH存储为全局,因此在walktree
方法返回后,初始答案仍然存在。
我建议不使用全局变量来修复代码。只需让check_matching
直接返回结果给walktree
,并且不要在walktree
返回后缓存路径结果。