如何将新文本和变量添加到.txt文件

时间:2017-10-06 22:14:18

标签: python string file format

我们给了一个包含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的答案诀窍!我不会想到这个!

2 个答案:

答案 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