2016-02-02 33 views
0

我是新手,無法搜索到確切的問題。雖然對你們許多人來說很簡單,但這對我來說肯定是一個充滿了煩惱的碗。所以,這裏是...如何在python中逐行求和

我有一個文本文件的列和行。列是字符串,行是數字。

EXAMPLE: text file. 
Line 1: a.1 2.g 2.2 b.3 
Line 2: -------------------- 
Line 3: 1 2 4 1 
Line 4: 3 3 1 1 
Line 5: 2 1 5 8 

我需要閱讀的文本文件,並做一些簡單的數學。 1.合計行3,4,5。

最終結果應該像下面這樣:

FINAL 
Line 1: 
Line 2: 
Line 3: 8 
Line 4: 8 
Line 5: 16 

這裏是我迄今爲止...

files = open("exam-grades.txt", "r") 
line_number = 1 
for line in files: 
    if (line_number == 1 or line_number == 2): 
     continue 

    else: 

     sum = 0 
     numbers = line.split("\t") 
     for n in numbers: 
      sum = sum + float(n) 

     print "Line #: %d/Sum is %d ."%(line_number,sum) 

    line_number = line_number + 1 
+1

怎麼是你迄今缺乏寫的嗎? –

+1

您是否嘗試過在循環中的不同點處打印出一些變量?另外,請注意,您正在覆蓋python的內置方法總和。最後,確保在完成之後關閉文件指針(文件) –

回答

4

line_number爲1開始,所以它遇到第一個if聲明和continue s沒有遞增line_number,因此對每一行都做同樣的事情,並且不處理它們中的任何一行。

您可以通過更換您的循環頂部像這樣糾正這一點:這裏

for line in files: 
    if line_number>=3: 
     sum = 0 
... 
2
with open("exam-grades.txt", "r") as f: 
    for i, line in enumerate(f, start=1): 
     if i >= 3: 
      l = line.split() 
      print l[0], l[1], sum((int(i) for i in l[2:] if i.isdigit())) 

邏輯很簡單,你枚舉從1開始文件的行。 檢查行號是否爲3或更高版本,將行分割成列表並驗證列表元素是否可能轉換爲int,如果可能我們將其加總並打印出來。

0

1)使用pass,而不是continue,如果使用continueline_number將不會被更新

2)得到的數字使用first_part, numbers = line.split(':');numbers = number.split()。 因爲如果你試圖讓數字像你這樣它會失敗:

>>> sum = 0 
>>> line="Line 3:  1  2  4  1" 
>>> numbers = line.split("\t") 
>>> numbers 
['Line 3:', '1', '2', '4', '1'] 
>>> for n in numbers: 
...    sum = sum + float(n) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
ValueError: could not convert string to float: Line 3: 

您768,16跳過第一個元素'Line 3:'

試試這個:

files = open("exam-grades.txt", "r") 
line_number = 1 
for line in files: 
    if (line_number == 1 or line_number == 2 or line_number == 3): 
     print "Line %d:" % line_number 
     pass 

    else: 

     sum = 0 
     first_part, numbers = line.split(":") 
     for n in numbers.split(): 
      sum = sum + float(n) 

     print "Line %d: Sum is %d" % (line_number,sum) 

    line_number = line_number + 1 
+0

@ user5874729選中此項。 – Zety

+0

謝謝!!將「繼續」更改爲「通過」。 ....仍然試圖理解整個「編碼」的事情..無論如何,非常感謝! – user5874729

-1

似乎有點像一個天然的正則表達式對我來說,這取決於你的號碼的複雜性......在這個例子中,我有「數據」作爲通用的迭代輸入數據:

import re 
valid = re.compile(r'^(?:\s*(\d+\s*))+\s*$') 
numbers = re.compile(r'(\d+)') 
for line,row in enumerate(data): 
    if valid.match(row): 
     print "Line #: %d/Sum is %d ."%(line+1,sum(map(int, numbers.findall(row)))) 
+0

不知道爲什麼這個答案是downvoted - 它提供了一個實際的解決方案提出的問題。有興趣瞭解這種方法對於解決問題沒有用... – F1Rumors

1

我會盡量做到更靈活一點 - 即我們不會爲線,其中至少有一個值不能被轉換爲float /數總結號:

def to_number(s): 
    try: 
     return float(s) 
    except ValueError: 
     return None 

def sum_in_line(s): 
    sm = 0 
    cols = s.split() 
    try: 
     return sum(to_number(x) for x in cols) 
    except TypeError: 
     return '' 

with open("exam-grades.txt", "r") as f: 
    i = 1 

    for line in f: 
     print('%4d:\t%s' % (i, sum_in_line(line))) 

     i += 1 

輸入數據:

a.1 2.g 2.2 b.3 
-------------------- 
1 2 4 1 
3 3 1 1 
2 1 5 8 
1 a Z 12 

輸出:

1: 
    2: 
    3: 8.0 
    4: 8.0 
    5: 16.0 
    6: