2015-10-17 4 views
1

У меня есть текстовый файл, содержащие номера, как это:Расчет средних чисел в файле .txt с помощью Python

a: 0.8475  
b: 0.6178 
c: 0.6961  
d: 0.7565  
e: 0.7626  
f: 0.7556   
g: 0.7605  
h: 0.6932  
i: 0.7558  
j: 0.6526  

Я хочу, чтобы извлечь только число с плавающей запятой из этого файла и вычислить среднее , Вот моя программа до сих пор,

fh = file.open('abc.txt') 
for line in fh: 
    line_pos = line.find(':') 
    line = line[line_pos+1:] 
    line = line.rstrip() 
    sum = 0 
    average = 0 
    for ln in line: 
     sum = sum + ln 
    average = sum/len(line) 

print average 

Может кто-нибудь сказать мне, что не так с этим кодом. Спасибо

+0

Обратите внимание, что обман только обрабатывает целые числа, поэтому будьте осторожны! –

+0

[используйте 'math.fsum()', чтобы избежать потери точности] (http://stackoverflow.com/q/8599333/4279). Рассмотрим 'sum ([1e20, 1, -1e20]) == 0.0' vs. 'math.fsum ([1e20,1, -1e20]) == 1.0'. 'L = [float (line.split (':') [1]) для строки в open ('abc.txt')]; average = math.fsum (L)/len (L) ' – jfs

ответ

2
  • Преобразуйте строку в float, чтобы сделать числовое дополнение.
  • Инициализировать sum один раз (до начала цикла). Вычислите среднее значение после цикла один раз.
  • len (линия) даст вам неправильный номер. Число символов digitis + newline для последнего номера.
  • Старайтесь избегать использования str.find + нарезка. Использование str.split более читаемо.

with open('abc.txt') as fh: 
    sum = 0 
    numlines = 0 
    for line in fh: 
     n = line.split(':')[-1] 
     sum += float(n) 
     numlines += 1 
    average = sum/numlines 
print average 
+1

это может сработать, но на Python ужасно однообразно. Старайтесь избегать использования команд 'str.find'. В этом случае 'num = float (line.split (": ")) [- 1]' is many –

+0

@AdamSmith, Спасибо за комментарий. Я соответствующим образом обновил ответ. – falsetru

2

У вас есть sum дополнение в неправильном месте, и вы должны следить за количеством строк, так как вы не можете отправить объект файла len(). Вам также нужно будет наложить строки на float s. Я бы порекомендовал просто расщепление на пробелы. Наконец, используйте конструкцию with для автоматического закрытия файла:

with open('abc.txt') as fh: 
    sum = 0 # initialize here, outside the loop 
    count = 0 # and a line counter 
    for line in fh: 
     count += 1 # increment the counter 
     sum += float(line.split()[1]) # add here, not in a nested loop 
    average = sum/count 

    print average 
+0

Это происходит только после того, как разделитель равен ':' (обратите внимание на конечное пространство. Вероятно, безопаснее делать 'line.split (": ")' –

+1

Я не уверен, что двоеточие или пробел является более надежной частью из этого, так что я просто предполагаю, что они оба одинаково действительны. Учитывая выбор, пробел 'split' выглядит немного чище, поэтому я пошел с этим. Но да, если окажется, что пробел произвольным, но двоеточие не является, тогда потребуется изменение. – TigerhawkT3

Смежные вопросы