我有以下代码,我知道简单(请随时建议改进)
看来用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))
提前致谢
答案 0 :(得分:9)
您的计数已关闭,因为以bash
或ksh
结尾的文件名也以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', '')
。