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

时间:2015-02-07 22:53:00

标签: function python-3.x tuples lambda

尝试创建一个带有文件名的函数,它返回一个2元组,其中包含该程序中非空行的数量,以及所有这些行的长度之和。这是我目前的计划:

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)

还有一种更好的方法是使用函数map,filter和reduce来查找行长度的总和吗?我是在第一部分做到的,但无法弄清楚下半场。 AM有点像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个字符,包括空格。我道歉,我误读了这个问题。每行的总长度也应包括空格。

2 个答案:

答案 0 :(得分:2)

一个相当简单的方法是构建一个生成器以去除尾随空格,然后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)

答案 1 :(得分:1)

为了计算行数,这段代码可能更清晰:

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

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

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

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