我们给了一个包含3列的.txt文件;名称,身高和体重。我们需要为BMI添加第4列(来自给定的公式),以及查找每个类别的最小值,最大值和平均值。
文本来自本地文件," 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()忽略第一行,我自己制作标题。我也无法在行上方打印一个独立的标题&#34;对于in_file中的line_str:&#34;由于某些原因;在这种情况下,我只是打算制作自己的标题,然后按照我需要的格式逐行打印出我需要的结果。似乎效率低下......
编辑:Alessio的答案诀窍!我不会想到这个!
答案 0 :(得分:0)
在这里,这可能是您正在寻找的解决方案。 它将BMI列打印到“result”变量中其他列的右侧。一旦你做了它,你可以做任何事情,从把它写到文件或打印到控制台(就像我做:))。 如果您需要添加其他列,请按照示例:))
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))
答案 1 :(得分: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