总计似乎是错的

时间:2012-02-27 12:03:07

标签: python

我有以下代码,我知道简单(请随时建议改进)

看来用shell脚本功能,总计似乎是错误的,我算22但报告是42,代码是否有问题。

import os

myPath = os.getenv("scripts")
pyCounter = 0 
sqlCounter = 0
shCounter = 0

def python_scripts():
  global pyCounter
  for root, dirs, files in os.walk(myPath):     
    for file in files:             
      if file.endswith('.py'):             
       pyCounter += 1 

def sql_scripts():
  global sqlCounter
  for root, dirs, files in os.walk(myPath):     
    for file in files:             
      if file.endswith('.sql'):             
       sqlCounter += 1 

def sh_scripts():
  global shCounter
  shell_ext = ['ksh','sh','bash']
  for shell in shell_ext:
    for root, dirs, files in os.walk(myPath):     
      for file in files:             
        if file.endswith(shell):
           shCounter += 1

python_scripts()
sql_scripts()
sh_scripts()

print ("Python : " + str(pyCounter))
print ("SQL : "  + str(sqlCounter))
print ("Shell : " + str(shCounter))

提前致谢

3 个答案:

答案 0 :(得分:9)

您的计数已关闭,因为以bashksh结尾的文件名也以sh结尾。您应该包含.以确保它确实是扩展名。您还可以将一个字符串元组传递给str.endswith(),避免其中一个循环。

这是你的代码清理了一下。这三个函数基本上都是做同样的事情,只是使用不同的扩展,所以你应该编写一个接受参数的函数。而不是为计数器使用全局变量,只需返回值:

def count_files(path, extensions):
    counter = 0
    for root, dirs, files in os.walk(path):
        for file in files:
            counter += file.endswith(extensions)
    return counter

path = os.getenv("scripts")
print count_files(path, '.py')
print count_files(path, '.sql')
print count_files(path, ('.ksh', '.sh', '.bash'))

答案 1 :(得分:2)

使用fnmatch.filter来做这种事情,例如:

import fnmatch
import os

py_files = []
for root, dirnames, filenames in os.walk(myPath):
  for filename in fnmatch.filter(filenames, '*.py'):
      py_files.append(os.path.join(root, filename))

pyCounter = len(py_files)

答案 2 :(得分:1)

您实际上不需要多次遍历目录树。

当您走过它时,您可以使用collections.Counter()跟踪您看到的所有扩展程序。

示例:

import os
from collections import Counter
path = '.'

c = Counter(os.path.splitext(f)[1] for _, _, files in os.walk(path) for f in files)

# now you'll just need to sum or extract the counts that you want
sh_ext = ('.ksh', '.sh', '.bash')
sh_scripts = sum(c[ext] for ext in sh_ext)
py_scripts = c['.py']

建议使用{em> wim 扩展名来使用os.path.splitext(),这是一个很好的建议。看一下doc:

  

os.path.splitext(path)

     
    

将路径名路径拆分为(root, ext)root + ext == path,并且      ext 为空或以句点开头,最多包含一个句点。基本名称的前导句点被忽略; splitext('.cshrc')会返回('.cshrc', '')