2015-02-07 46 views
2

我試圖創建一個函數,它接受一個文件名並返回一個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

回答

2

一個相當簡單的方法是建立一個發電機剝離後的空白,然後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

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())) 

有人建議你在一個循環中完成這兩件事。這很好,但是如果讓它們分開,你可以使它們變成不同的功能,並且以這種方式具有更多的可重用性。除非你正在處理大文件(或者執行這個代碼數百萬次),否則就性能而言應該沒有關係。

+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