2016-11-19 88 views
0

我想递归计算一个路径中的python文件和非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() 

我的几个问题是

  1. 我在保持多个计数器在一个递归函数遇到了麻烦。
  2. 此外,我想要的是一个字典格式,但我只能这样做,因为我必须返回它的路径。
  3. 我使用print(files)来检查功能是否正常工作,但它显示了我从未在我的文件夹中看到过很多文件(前7个文件),为什么会发生这种情况?

print(files)

/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}) 

顺便说一句,我们必须使用递归函数,它是强制性的要求的教授。

+0

该函数如何知道何时停止? –

+0

它通过我提供的路径遍历所有文件和目录时会停止 – Byron

+0

我不太明白'stop'是什么意思吗? – Byron

回答

1

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

您不能更改调用者的局部变量/参数。如何返回total_python,total_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) 

或者,os.scandir自Python 3.5起也可用。

+1

谢谢,os.walk确实使任务更容易,但我们的教授迫使我们使用递归函数 – Byron

+0

@Byron,你是说这是作业吗? – falsetru

+0

所以函数必须有一个基本的情况下,递归的情况下 – Byron

1

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

首先intialize字典:

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

然后修改它的递归函数里面:

counters['py'] += 1 

这工作,因为字典是mutable

+0

谢谢!字典计数器工作,但我不知道为什么柜台一直给我0,0,如果我输入一个目录的路径。你能看看吗? – Byron

+0

看看是什么?你的代码在哪里? – stenci

+0

嗨对不起,我忘了更新我的问题,现在在问题中,我根据您的建议更改了一些代码。目录的输入路径中有多个文件,但输出仍然是(0,0) – Byron

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 
+0

谢谢!但我不知道为什么柜台一直给我0,0,如果我输入一个目录的路径。 – Byron