计算 python 中的非空行和这些行的长度总和

counting non-empty lines and sum of lengths of those lines in python

我正在尝试创建一个函数,它接受一个文件名,它 returns 一个二元组,其中包含该程序中非空行的数量,以及所有这些行的长度之和。这是我当前的程序:

def code_metric(file):
    with open(file, 'r') as f: 
        lines = len(list(filter(lambda x: x.strip(), f)))
        num_chars = sum(map(lambda l: len(re.sub('\s', '', l)), f))

    return(lines, num_chars)

我得到的结果是:

if __name__=="__main__":
print(code_metric('cmtest.py'))

(3, 0)

应该是:

(3,85)

还有没有更好的方法来使用函数映射、过滤和减少来计算线的长度总和?我在第一部分做到了,但无法弄清楚后半部分。我是 python 的新手,所以任何帮助都会很棒。

这是名为 cmtest.py 的测试文件:

import prompt,math

x = prompt.for_int('Enter x')
print(x,'!=',math.factorial(x),sep='')

First line has 18 characters (including white space)
Second line has 29 characters
Third line has 38 characters

[(1, 18), (1, 29), (1, 38)]

行数为 85 个字符,包括空格。抱歉,我误读了问题。每行的总长度也应包括空格。

为了计算行数,也许这段代码更清晰:

with open(file) as f:
    lines = len(file.readlines())

对于程序的第二部分,如果您打算只计算非空字符,那么您忘记删除'\t' 和'\n'。如果是这样的话

with open(file) as f:
    num_chars = len(re.sub('\s', '', f.read()))

有些人建议您在一个循环中完成这两件事。这很好,但如果你将它们分开,你可以将它们分成不同的功能,并以这种方式提高它们的可重用性。除非你正在处理巨大的文件(或执行此代码数百万次),否则它在性能方面应该无关紧要。

一个相当简单的方法是构建一个生成器来去除尾随空格,然后 enumerate 覆盖它(起始值为 1)filter 去掉空行,然后对长度求和每行依次,例如:

def code_metric(filename):
    line_count = char_count = 0
    with open(filename) as fin:
        stripped = (line.rstrip() for line in fin)
        for line_count, line in enumerate(filter(None, stripped), 1):
            char_count += len(line)
    return line_count, char_count

print(code_metric('cmtest.py'))
# (3, 85)