2016-11-19 6 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