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

Python在一个递归函数中保留多个计数器,python,python-3.x,python-3.5,Python,Python 3.x,Python 3.5,我试图递归地计算路径中python文件和非python文件的数量 import os def main(): #path = input('Enter an existing path to a file or directory: ') path ='/Users/ziyuanhan/PycharmProjects/lab6/' print(count_file(path, counter={'py':0, 'non_py':0})) def count_file(p

我试图递归地计算路径中python文件和非python文件的数量

import os
def main():
    #path = input('Enter an existing path to a file or directory: ')
    path ='/Users/ziyuanhan/PycharmProjects/lab6/'
    print(count_file(path, counter={'py':0, 'non_py':0}))

def count_file(path,counter):
    if os.path.isfile(path):
        if path.endswith('.py') :
            counter['py']+=1
            return path, counter
        else:
            counter['non_py']+=1
            return path, counter
    elif os.path.isdir(path):
        for files in os.listdir(path):
            print(files)
            path = os.path.abspath(files)
            print(path)
            count_file(path, counter)
        return path, counter

main()
我遇到的几个问题是

  • 我很难在一个递归函数中保留多个计数器
  • 另外,我想要的返回是字典格式,但我只能这样做,因为我必须用path返回它
  • 我使用
    print(files)
    检查功能是否正常工作,但它显示了更多我在文件夹中从未见过的文件(前7个文件),为什么会发生这种情况
  • 打印(文件)


    顺便说一句,我们必须使用递归函数,这是教授要求的必需的。

    您不需要自己递归地迭代目录。您可以使用它为您生成目录、文件:

    不能更改调用者的局部变量/参数。返回
    total\u python
    total\u non\u 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开始使用。您不需要自己递归地迭代目录。您可以使用它为您生成目录、文件:

    不能更改调用者的局部变量/参数。返回
    total\u python
    total\u non\u 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开始使用。您可以将字典作为参数传递给函数,并更改字典中项目的值

    首先初始化字典:

    counters = {'py': 0, 'other': 0}
    
    然后在递归函数中修改它:

    counters['py'] += 1
    

    这将起作用,因为字典是。

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

    首先初始化字典:

    counters = {'py': 0, 'other': 0}
    
    然后在递归函数中修改它:

    counters['py'] += 1
    

    这将起作用,因为字典是。

    此函数采用路径名并返回
    (total\u python,total\u not\u 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
    

    此函数接受路径名并返回
    (total\u python,total\u not\u 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
    


    谢谢,os.walk确实使任务变得更容易,但是我们的教授强迫我们使用递归函数,所以函数必须有一个基本情况和一个递归情况不完全是,它是一个pproject@Byron,好的,那么我会给你家庭提示,而不是给你直接的代码。(1) 如果文件是目录,则需要递归调用
    count\u file
    ;如果文件是目录,则忽略当前文件。(2)
    total_python+=1
    不影响调用方的变量。仅在调用方中进行更改。您最好返回值并在调用方外部使用。您好,我根据您的建议更改了一些代码,您能再看一看吗?谢谢,os.walk确实使任务更容易,但我们的教授强制我们使用递归函数,因此函数必须有基本情况和递归情况不完全是,它是一个pproject@Byron,好的,那么我会给你家庭提示,而不是给你直接的代码。(1) 如果文件是目录,则需要递归调用
    count\u file
    ;如果文件是目录,则忽略当前文件。(2)
    total_python+=1
    不影响调用方的变量。仅在调用方中进行更改。你最好返回值并在调用方外部使用。嗨,我根据你的建议更改了一些代码,请你再看一看好吗?这个函数如何知道何时停止?它在运行完我提供的路径的所有文件和目录后停止。我不太明白“停止”是什么意思?这个函数如何知道何时停止?它在运行完我提供的路径的所有文件和目录后停止我不太明白你说的“停止”是什么意思?谢谢!但是我不知道为什么如果我输入一个目录的路径,计数器总是给我0,0。谢谢!但是我不知道为什么如果我输入一个目录的路径,计数器总是给我0,0。谢谢!字典计数器工作,但我不知道如果我输入目录的路径,为什么计数器总是给我0,0。你能看一下吗?嗨,对不起,我忘了更新我的问题,它现在在问题中,我根据你的建议更改了一些代码。目录的输入路径中有多个文件,但输出仍然是(0,0)。第一个错误是
    path=os.path.abspath(files)
    假定
    文件
    位于当前文件夹中,而不是正在扫描的文件夹中。我想您是想使用
    path=os.path.join(path,files)
    。即使这样做,它也不起作用,因为您正在重用变量
    path
    。您可以在该行和下面的第2行使用另一个变量
    path2
    ,该变量运行良好。您不应该删除或编辑问题中已经有答案的部分。您可以在问题底部添加编辑,并解释您正在将该部分添加到问题中,以参考答案或评论。否则,未来的读者将无法理解为什么会给出某些答案或评论!字典计数器工作,但我不知道如果我输入目录的路径,为什么计数器总是给我0,0。你能看一下吗?嗨,对不起,我忘了更新我的问题,它现在在问题中,我根据你的建议更改了一些代码。目录的输入路径中有多个文件,但输出仍然是(0,0)。第一个错误是
    path=os.path.abspath(files)
    假定
    文件
    位于当前文件夹中,而不是正在扫描的文件夹中。我想您是想使用
    path=os.path.join(path,files)
    。即使这样做,它也不起作用,因为您正在重用变量
    path
    。您可以使用另一个变量
    path2