Python在一个递归函数中保留多个计数器

时间:2016-11-19 07:35:21

标签: python python-3.x python-3.5

我试图以递归方式计算路径中的python文件和非python文件的数量。

print(files)

我遇到的一些问题是

  1. 我在一个递归函数中保留多个计数器时遇到了麻烦。
  2. 我想要的回报也是字典格式,但我只能这样做,因为我必须用路径返回它。
  3. 我使用print(files)检查该功能是否正常工作,但它显示了我在文件夹中从未见过的更多文件(前7个文件),为什么会发生这种情况?
  4. /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/ziyuanhan/PycharmProjects/lab7/recursive_dir_traversal.py .DS_Store /Users/ziyuanhan/PycharmProjects/lab7/.DS_Store .idea /Users/ziyuanhan/PycharmProjects/lab7/.idea lab7.iml /Users/ziyuanhan/PycharmProjects/lab7/lab7.iml misc.xml /Users/ziyuanhan/PycharmProjects/lab7/misc.xml modules.xml /Users/ziyuanhan/PycharmProjects/lab7/modules.xml workspace.xml /Users/ziyuanhan/PycharmProjects/lab7/workspace.xml km_mi_table.py /Users/ziyuanhan/PycharmProjects/lab7/km_mi_table.py km_to_miles.py /Users/ziyuanhan/PycharmProjects/lab7/km_to_miles.py wordfrequency.py /Users/ziyuanhan/PycharmProjects/lab7/wordfrequency.py ('/Users/ziyuanhan/PycharmProjects/lab7/wordfrequency.py', {'non_py': 0, 'py': 0})

    INSERT INTO Destination_Table [new_date] 
    SELECT CONVERT(DATE,nullif([startdate],'NULL'),103) 
    from   Source_Table
    

    BTW我们必须使用递归函数,这是教授要求的强制性。

3 个答案:

答案 0 :(得分:1)

您不需要自己递归迭代目录。您可以使用os.walk为您生成目录,文件:

您无法更改调用方的本地变量/参数。如何返回total_pythontotal_non_python并在下面的来电中使用?

def count_file(path):
    total_python, total_non_python = 0, 0
    for parent, directories, files in os.walk(path):
        for filename in files:
            if filename.lower().endswith('.py'):
                total_python += 1
            else:
                total_non_python += 1
    return total_python, total_non_python

def main():
    path = input('Enter a path to a file or directory: ')
    total_python, total_non_python = count_file(path)
    print(path, total_python, total_non_python)

或者,从Python 3.5开始,os.scandir也可用。

答案 1 :(得分:1)

您可以将字典作为参数传递给函数,并更改字典中项目的值。

首先初始化字典:

counters = {'py': 0, 'other': 0}

然后在递归函数中修改它:

counters['py'] += 1

这会有效,因为词典是mutable

答案 2 :(得分:0)

此函数采用路径名并返回(total_python, total_not_python)。它在目录中的每个条目上调用自身。这意味着与给定代码一样合理。

def count_file(path):
    if os.path.isfile(path):
        if path.endswith('.py') :
            return 1, 0
        else:
            return 0, 1
    elif os.path.isdir(path):
        total_python, total_not_python = 0, 0
        for files in os.listdir(path):
            print(files)
            path = os.path.join(path, files)
            subtotal_python, subtotal_python = count_file(path)
            total_python += subtotal_python
            total_not_python += subtotal_not_python
        return total_python, total_not_python