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

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

问题描述:

我试图创建一个函数,它接受一个文件名并返回一个2元组,并且该程序中的非空行数,所有这些线的长度。这是我目前的计划:计算python中非空行和长度的总和

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

(3, 0) 

当它应该是::如果我做

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) 

结果我得到的是得到

(3,85) 

还有找到长度总和的更好方法线使用功能图,过滤和减少?我做了第一部分,但无法弄清楚下半场。 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个字符,包括空格。我很抱歉,我错读了这个问题。每行的总长度也应该包括空格。

+0

你确定当你计算你没有计算行中空格的字符数吗? – Aradmey 2015-02-07 22:56:46

+0

您正在做两次迭代(每次打开文件并循环播放) - 如果要提高效率,为什么不将两个操作合并到一个迭代中? – alfasin 2015-02-07 22:59:40

+0

@ Aradmey-我很确定。它只有1。这就是为什么我似乎无法弄清楚为什么?我 – BoJaNgLeS 2015-02-07 23:49:06

一个相当简单的方法是建立一个发电机剥离后的空白,然后enumerate过该(以1: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) 
+0

我明白,但它必须使用函数式编程风格,使用函数式映射,过滤器和减少来实现。这是为了学习的目的。 – BoJaNgLeS 2015-02-08 03:12:19

+0

@BoJaNgLeS做,可以 - 尽管不是很强的可读性/建议......给我一个莫:对 – 2015-02-08 03:13:36

+0

@ JonClements-中想出来的任何运气? – BoJaNgLeS 2015-02-08 16:05:28

为了计算行,也许这个代码是清洁:

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

对于您方案的第二部分,如果你打算只计算非空字符,然后你忘了删除“\ t '和'\ n'。如果是这种情况

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

有人建议你在一个循环中完成这两件事。这很好,但是如果让它们分开,你可以使它们变成不同的功能,并且以这种方式具有更多的可重用性。除非你正在处理大文件(或者执行这个代码数百万次),否则就性能而言应该没有关系。

+0

如果我使用'开放(文件)为f:。 NUM_CHARS = SUM(地图(拉姆达l:len(re.sub('\ s','' ,l)),f))'我得到'(3,0)'而不是'(3,85)' – BoJaNgLeS 2015-02-08 00:30:52

+0

你的线路是怎样的?我有一个带'''''abc d'e'''和''''''''''的文件。运行后,我得到'''num_chars'''等于10. – 2015-02-08 00:36:07

+0

Almeda-在问题中有一个测试文件。这是正在测试的文件,并且线条看起来完全如示例中所示。 – BoJaNgLeS 2015-02-08 00:38:49