2015-04-05 52 views
0

我創建一個函數讀取.txt文件,該文件包含以下內容:平均通過str .txt文件的和int內它

Testing.txt:

a 1 34 
b 2 25 
c 3 23 
j 4 80 

我需要創建一個函數讀取此文件並打印文件中每行的最後2位數的平均值。

我到目前爲止是這樣的:

def Stats(): 

    filename = input("Enter a file name: ") 
    with open(filename) as f: 
     data = [int(line) for line in f] 

    print("The average value is ", sum(data)/len(data)) 


Stats() 

優點:

  • 這個函數將在函數內部產生INT值的平均值。

缺點:

  • 如果該文件包含在它的STR它不會工作。

問題:如何讓我的函數能夠使用上面列出的名爲(testing.txt)的文件?

回答

1

我想這是你所追求的:

# filename = input("Enter a file name: ") 
filename = "input.txt" 

def avg_file(filename): 

    with open(filename, 'r') as f: 
     data = [int(line.split()[2]) for line in f] 
     return sum(data)/len(data) 


avg = avg_file(filename) 

print("The average value is: ", avg) 
# The average value is: 40.5 

關鍵是這個line.split()[2]。這將根據空格拆分一行,並取第3個值。

+0

由於某種原因,我仍然得到這個錯誤。 – stacker 2015-04-05 01:32:40

+0

你會得到什麼錯誤? – Marcin 2015-04-05 01:35:22

1

你可以忽略非數字是這樣的:

data = [int(token) for token in f.read().split() if token.isdigit()] 
1

什麼是這樣的:

import csv 

def mean(lst): return sum(lst)/len(lst) 

with open('input.txt') as f: 
    reader = csv.reader(f, delimiter=' ') 
    lines = [line for line in reader] 

col3 = [int(line[2]) for line in lines] 

print(mean(col3)) # 40.5 

這只是使用csv模塊的文件行分析爲包含元素行。你可以做到相同的事情的東西,如:

def mean(lst): return sum(lst)/float(len(lst)) 

with open('input.txt') as f: 
    lines = [line.split() for line in f] 

col3 = [int(line[2]) for line in lines] 

print mean(col3) # 40.5 
1

事情是這樣的:

data = [sum(map(int, line.split(' ')[1:]))/2 for line in f] 

或者一些更老派,如果你有字符串的未知混合和int值:

data = [] 
for line in f: 
    integers = [] 
    for segment in line.split(): 
     try: 
      integers.append(int(segment)) 
     except ValueError: 
      pass 
    data.append(sum(integers)/len(integers))