2017-10-06 72 views
0

我们给出了一个带有3列的.txt文件;名称,身高和体重。我们需要为BMI添加第四列(来自给定的公式)以及查找每个类别的最小值,最大值和平均值。如何将新文本和变量添加到.txt文件

该文本来自本地文件“data.txt”。这里是(用于打印它的代码块使它保持格式化)文本:

Name  Height(m) Weight(kg)  
Joe   1.82  72.57  
Mary  1.60  63.50  
Dion  1.90  90.71  
Kayla  1.72  66.31  
Jose  1.78  70.23  
Sofia  1.63  65.12  
Erik  1.98  92.21  
Sara  1.57  65.77 

这里是我到目前为止的代码,显示它基本完成,除BMI列:

in_file = open("data.txt","r") 
th=0 #total height 
tw=0 #total weight 
tbmi=0 #total bmi 
min_h=3.00 
min_w=100.00 
min_bmi=40 
max_h=0 
max_w=0 
max_bmi=0 

for line_str in in_file: 
    print(line_str,end="") 
    if 'Heigh' not in line_str: 
    a = float((line_str[12:16])) 
    b = float((line_str[23:27])) 
    bmi=(b/(a**2)) 
    tbmi+=bmi 
    th += a 
    tw +=b 
    if min_h > a: 
     min_h = a 
    if min_w > b: 
     min_w = b 
    if min_bmi > bmi: 
     min_bmi = bmi 
    if max_h < a: 
     max_h =a 
    if max_w < b: 
     max_w =b 
    if max_bmi < bmi: 
     max_bmi = bmi 
print("") 
print('{:<12s}{:<12.2f}{:<12.2f}{:<12.2f}'.format("Average", th/8, tw/8, tbmi)) 
print('{:<12s}{:<12.2f}{:<12.2f}{:<12.2f}'.format("Max", max_h, max_w, max_bmi)) 
print('{:<12s}{:<12.2f}{:<12.2f}{:<12.2f}'.format("Min", min_h, min_w, min_bmi)) 

我需要做的就是有一个包含标题BMI的列,并将所有BMI值添加到每个line_str,但无法获得任何工作,例如使用readline()忽略第一行, d制作我自己的标题。由于某种原因,我也无法在“in_file:for line_str:”行上面打印独立标题;在这种情况下,我只是要制作自己的标题,然后将需要的格式一行一行地逐行打印出来。似乎效率低下...

编辑:Alessio的答案做了诡计!不会想到那个!

+1

这可能是因为你已经打开了在读模式下的文件。 “in_file = open(”data.txt“,”r“)” –

+0

“你不能得到任何工作”是什么意思?它当然会印上一些东西或给你一个回溯。 –

+0

对不起,这是...它会打印我需要的值,比如平均值等等。什么都行不通,尝试使用readline()跳过第一行文本并制作自己的标题,或者打印在文本文件上方新建一行(然后我打算只打印每个字符串所需的字符串,但格式不正确)但是,由于某些原因,它不会让我在“for_file中的line_str”上面打印 – Marty

回答

0

在这里,这可能是您正在寻找的解决方案。 它将BMI列打印在“结果”变量中其他列的右侧。一旦你达到目的,你可以做任何事情,从写到文件或打印到控制台(如我:))。 如果您需要添加其他列,只是效仿:)

in_file = open("data.txt","r") 
th=0 #total height 
tw=0 #total weight 
tbmi=0 #total bmi 
min_h=3.00 
min_w=100.00 
min_bmi=40 
max_h=0 
max_w=0 
max_bmi=0 

result = "Name  Height(m) Weight(kg) BMI\n" 
for line_str in in_file: 
    #print("TEST: " + line_str) 
    if 'Height' not in line_str: 
     a = float((line_str[12:16])) 
     b = float((line_str[23:27])) 
     bmi=(b/(a**2)) 
     result += line_str[0:len(line_str)-1] + '{:<12.2f}'.format(bmi) + "\n" 
     tbmi+=bmi 
     th += a 
     tw +=b 
     if min_h > a: 
      min_h = a 
     if min_w > b: 
      min_w = b 
     if min_bmi > bmi: 
      min_bmi = bmi 
     if max_h < a: 
      max_h =a 
     if max_w < b: 
      max_w =b 
     if max_bmi < bmi: 
      max_bmi = bmi 

print(result) 

print("") 
print('{:<12s}{:<12.2f}{:<12.2f}{:<12.2f}'.format("Average", th/8, tw/8, tbmi)) 
print('{:<12s}{:<12.2f}{:<12.2f}{:<12.2f}'.format("Max", max_h, max_w, max_bmi)) 
print('{:<12s}{:<12.2f}{:<12.2f}{:<12.2f}'.format("Min", min_h, min_w, min_bmi)) 
0

每当你需要处理的表样的文件,我总是建议你使用pandas,以使你的代码更清洁和更容易延长。

你想达到什么是很容易使用下面的代码片段完成:

import pandas as pd 

df = pd.read_csv('data.txt', sep='\s+') 
df["BMI"] = df["Weight(kg)"]/(df["Height(m)"] * df["Height(m)"]) 
print(df) 
print(df.describe()) 

输出:

Name Height(m) Weight(kg)  BMI 
0 Joe  1.82  72.57 21.908586 
1 Mary  1.60  63.50 24.804687 
2 Dion  1.90  90.71 25.127424 
3 Kayla  1.72  66.31 22.414143 
4 Jose  1.78  70.23 22.165762 
5 Sofia  1.63  65.12 24.509767 
6 Erik  1.98  92.21 23.520559 
7 Sara  1.57  65.77 26.682624 

     Height(m) Weight(kg)  BMI 
count 8.000000 8.000000 8.000000 
mean 1.750000 73.302500 23.891694 
std  0.147067 11.583038 1.680321 
min  1.570000 63.500000 21.908586 
25%  1.622500 65.607500 22.352048 
50%  1.750000 68.270000 24.015163 
75%  1.840000 77.105000 24.885372 
max  1.980000 92.210000 26.682624 
+0

这肯定是一种更简单的方法!现在对于这个类,我们有关于我们可以和不可以使用的非常严格的参数。大熊猫听起来很熟悉,因为我相信我们会在不久的将来使用它们。然而,这项任务主要是使用读写,格式化和真正基本的东西。我不能等到我们可以使用更高效的东西......谢谢! – Marty

相关问题