计算 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)
我正在尝试创建一个函数,它接受一个文件名,它 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)