如何在Python中对文本文件中的数字求和

时间:2015-03-08 08:23:42

标签: python file sum

我有一个代码依赖于我阅读文本文件,打印有数字的数字,打印特定的错误消息,其中有字符串而不是数字,然后将所有数字相加并打印它们的总和(然后仅将数字保存到新文本文件中。)

我一直在尝试这个问题几个小时,我有下面的内容。

我不知道为什么我的代码似乎没有正确总结。

和python代码:

f=open("C:\\Users\\Emily\\Documents\\not_just_numbers.txt", "r")
s=f.readlines()
p=str(s)

for line in s:
    printnum=0
    try:
        printnum+=float(line)
        print("Adding:", printnum)    
    except ValueError:
        print("Invalid Literal for Int() With Base 10:", ValueError)

    for line in s: 
        if p.isdigit():
        total=0            
            for number in s:    
                total+=int(number)
                print("The sum is:", total)

7 个答案:

答案 0 :(得分:4)

  

我有一个代码依赖于我阅读文本文件,打印出来   有数字的数字,打印特定的错误消息   哪里有字符串而不是数字,然后总结所有   数字和打印他们的总和(然后只保存数字到一个   新文本文件)。

所以你必须做以下事情:

  1. 打印数字
  2. 在没有数字
  3. 时打印信息
  4. 汇总数字并打印总和
  5. 仅将数字保存到新文件
  6. 这是一种方法:

    total = 0
    
    with open('input.txt', 'r') as inp, open('output.txt', 'w') as outp:
       for line in inp:
           try:
               num = float(line)
               total += num
               outp.write(line)
           except ValueError:
               print('{} is not a number!'.format(line))
    
    print('Total of all numbers: {}'.format(total))
    

答案 1 :(得分:1)

每次输入新行时,如果数字为数字,则将总计重置为零。

您可能希望在进入循环之前初始化总数。


我尝试使用isdigit和isalpha调试for循环 显然,每一个新行都不被视为数字或字母数字,这些数字或字母数字总是被评估为假

事实证明你不需要for循环,你已经用你的try语言完成了大部分程序

以下是我在系统上的表现。

f = open("/home/david/Desktop/not_just_numbers.txt", 'r')
s = f.readlines()
p = str(s)

total = 0

for line in s:
    #print(int(line))
    printnum = 0
    try: 
        printnum += float(line)
        total += printnum
        #print("Adding: ", printnum)
    except ValueError:
        print("Invalid Literal for Int() With Base 10:", ValueError)

print("The sum is: ", total)

答案 2 :(得分:1)

以下是您可以做的事情:

data.txt中:

1
2
hello
3
world
4

代码:

total = 0

with open('data.txt') as infile:
    with open('results.txt', 'w') as outfile:

        for line in infile:
            try:
                num = int(line)
                total += num
                print(num, file=outfile)
            except ValueError:
                print(
                    "'{}' is not a number".format(line.rstrip())
                )

print(total)


--output:--
'hello' is not a number
'world' is not a number
10


$ cat results.txt
1
2
3
4

答案 3 :(得分:1)

您正在检查错误的情况:

for line in s: 
    if p.isdigit():

p就是这样:

s=f.readlines()
p=str(s)

作为列表的str ified版本,它将以'['开头,因此p.isdigit()将始终为false。您想要检查line.isdigit(),并且您只想初始化total一次,而不是每次都围绕循环:

total = 0
for line in f:
    if line.isdigit():
        total += int(line)

请注意,通过直接迭代f,您也不需要拨打readlines()

答案 4 :(得分:1)

你也可以试试这个:

f=open("C:\\Users\\Emily\\Documents\\not_just_numbers.txt", "r")
ww=open("C:\\Users\\Emily\\Documents\\not_just_numbers_out.txt", "w")
s=f.readlines()
p=str(s)


for line in s:
    #printnum=0
    try:
        #printnum+=float(line)
        print("Adding:", float(line))
        ww.write(line)
    except ValueError:
        print("Invalid Literal for Int() With Base 10:", ValueError)

total=0 
for line in s: 
    if line.strip().isdigit():
        total += int(line)
print("The sum is:", total)

此处str.strip([chars])表示

返回删除了前导和尾随字符的字符串副本。 chars参数是一个字符串,指定要删除的字符集。如果省略或None,则chars参数默认为删除空格。 chars参数不是前缀或后缀;相反,其值的所有组合都被剥离

答案 5 :(得分:0)

$ echo -e '1/n2/n3/n4/n5' | python -c "import sys; print sum(int(l) for l in sys.stdin)"

答案 6 :(得分:0)

这是对文件中所有数字求和的非常短的方法(您将必须添加try和except)

import re
print(sum(float(num) for num in re.findall('[0-9]+', open("C:\\Users\\Emily\\Documents\\not_just_numbers.txt", 'r').read())))