2012-11-30 56 views
2

我想製作一個從文件中抓取數字列表(可能會改變行和大小)的程序,然後打印出所有數字和平均值的總和。當我擁有一定數量的linereads時,我沒有遇到任何問題,但是當lineread每次運行都會改變時,我會對'正確'的方式感到困惑。從文件中獲取數字,並找出線數變化的平均值?

這是我的工作進行中的代碼。我讀了一下,找到了正確的(?)循環遍歷文件的方式來查找長度,但不知道如何實現它,因爲它當前會拋出某種類型的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() 
+1

這段代碼似乎沒有運行...你沒有在任何地方定義numTotal或numAvg。 – monkut

回答

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 
      ... 
+0

目標是抓住文本文件中的每一行,然後找到總數和平均值,然後將它們呈現給用戶。當我知道需要抓取多少條線時,我才能夠做到這一點,我遇到的問題是線條數隨每個文件讀取而改變。 –

+0

你提到的這些數字是什麼,所以這是每行1個數字? – monkut

+0

我希望程序能夠讀取一個簡單的數字列表文件,每行一個數字。第1行將是150,然後在下一行將是99,然後在下一行將是123等。 –

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

關於如何做你想做的事情有一些很好的答案。至於IO錯誤,內置的input()會嘗試評估用戶的輸入,這既危險又不是你想要的。

嘗試使用內置的raw_input()。這將以字符串的形式返回用戶的輸入。爲了好玩,試着運行你的腳本並將其作爲文件名並將它作爲__name__看看會發生什麼。

+0

我以爲raw_input不再存在於Python 3+中? –

+1

你是對的。心不在焉的回覆! –