如何在python中逐行求和

时间:2016-02-02 21:17:27

标签: python python-2.7 sum python-2.x

我是新手,无法搜索我的确切问题。虽然对你们许多人来说可能很简单,但对我来说这肯定是一个充满恶化的碗。所以,这是......

我有一个包含列和行的文本文件。列是字符串,行是数字。

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

5 个答案:

答案 0 :(得分:4)

line_number最初为1,因此它会在不增加if的情况下点击第一个continue语句和line_number,因此对每一行执行相同的操作,并且不会#39; t处理其中任何一个。

您可以通过更换循环顶部来纠正此问题:

for line in files:
    if line_number>=3:
        sum = 0
...

答案 1 :(得分: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,如果可能我们将其汇总并打印出来。

答案 2 :(得分:1)

我会尝试使其更灵活一点 - 即我们不会总结至少一个值不能转换为浮点数/数字的行的数字:

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:

答案 3 :(得分:0)

1)使用pass代替continue,如果您使用continue line_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:

你应该跳过第一个元素'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

答案 4 :(得分:-1)

对我来说似乎有点像正则表达式,这取决于数字的复杂性......在本例中,我将“data”作为输入数据的通用迭代器:

sudo apt-get install libpq-dev python-dev libxml2-dev libxslt1-dev libldap2-dev libsasl2-dev libffi-dev