从文件中取数字,找到线条数量变化的平均值?

时间:2012-11-30 02:14:09

标签: python loops file-io python-3.x readfile

我正在尝试制作一个程序,它从文件中抓取一个数字列表(可能会改变行和大小),然后打印出所有数字和平均值的总和。当我有一定数量的线读时,我没有遇到任何问题,但是当线读改变每次运行时,我对“正确”方式感到困惑。

这是我正在进行中的代码。我读了一下,找到了正确的(?)循环文件的方式来查找长度,但不知道如何实现它,因为它当前抛出某种类型的IO错误。谢谢你的帮助!

def main():
    filename = input("Enter file name (name.txt):")
    try:
        file = open(filename, "r")
    except IOError:
        print("Error opening file!")

    totalLines = totalLineGet(filename)

    results = []
    for x in range(totalLines):
            results.append(getLineNumber(x+1, file))

    print("Total = ", numTotal)
    print("Average = ", numAvg)

def totalLineGet(_filename):
    count = 0
    _file = open(_filename, "r")
    for x in open(_file):
        count+= 1
    return count

def getLineNumber(linetoget, _file):
    try:
        intNumber = int(number = _file.readline())
    except ValueError:
        print("Error in file data!")

    return intNumber

main()

4 个答案:

答案 0 :(得分:2)

我不确定你想做什么......但你应该能够一次性得到答案。 如果您需要知道项目/行号计数,可以使用enumerate()为可迭代对象编号,在本例中为文件。

假设每行有一个int():

with open(filename, "r") as in_f:
    numbers = []
    for line in in_f: 
        line = line.strip() # remove whitespace
        if line: # make sure there is something there
            number_on_line = int(line) 
            numbers.append(number_on_line)
    sum_of_numbers = sum(numbers)
    avg_of_numbers = sum(numbers)/len(numbers)

如果这是CSV数据,您应该使用csv模块进行查看,它会将行拆分成行/列。

import csv
filename = "somefile"
with open(filename, "rb") as in_f: # <-- notice "rb" is used
    reader = csv.reader(in_f)
    for row in reader:
        for col in row:
            # do stuff
            ...

答案 1 :(得分:1)

一个简单的解决方案,做你想做的......

filename = 'tmp.txt'
f = open(filename)
s, totnum = 0, 0
for line_number, line in enumerate(f):
    nums = map(int, line.split())
    s += sum(nums)
    totnum += len(nums)

print "numbers:", totnum, "average:", 1.0*s/totnum

答案 2 :(得分:1)

这假设您的文件每行只有数字而不是字符,否则您将获得TypeError

list_of_numbers = []

with open('somefile.txt') as f:
   for line in f:
      if line.strip(): # this skips blank lines
          list_of_numbers.append(int(line.strip()))

print 'Total ',len(list_of_numbers)
print 'Average ',1.0*sum(list_of_numbers)/len(list_of_numbers)

答案 3 :(得分:1)

关于如何做你想做的事,有一些很好的答案。至于IO错误,input()内置尝试评估用户的输入,这既危险又不是你想要的。

尝试使用内置的raw_input()。这将用户的输入作为字符串返回。为了好玩,尝试运行您的脚本并将其作为文件名__name__,并查看会发生什么。