【问题标题】:How do I add new text and variables to a .txt file如何将新文本和变量添加到 .txt 文件
【发布时间】:2017-10-06 22:14:18
【问题描述】:

我们得到一个包含 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() 忽略第一行,并且我会制作自己的标题。由于某种原因,我也无法在“for line_str in in_file:”行上方打印独立标题;在这种情况下,我只是要制作自己的标题,然后使用我需要的格式逐行打印出我需要的结果。似乎效率低下……

编辑:Alessio 的回答成功了!没想到!

【问题讨论】:

  • 这可能是因为您以读取模式打开了文件。 "in_file = open("data.txt","r")"
  • “什么都做不了”是什么意思?当然它会打印一些东西或给你一个回溯。
  • 抱歉...是的,它打印我需要的值,例如平均值等。什么不起作用,正在尝试 readline() 跳过第一行文本并制作我自己的标题,或在文本文件上方打印一个新行(然后我打算用正确的格式逐个字符串打印我需要的每个值)但它不会让我在“for line_str in in_file”上方打印出于某种原因
  • 您不能使用 readline 丢弃第一行,因为for line_str in in_file 总是从头开始。与任何 for 循环一样,它是一个新的迭代:for i in range(10) 始终以 i=0 开头,即使 i 之前被分配为 1。

标签: python string file format


【解决方案1】:

在这里,这可能是您正在寻找的解决方案。 它将 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))

【讨论】:

    【解决方案2】:

    每当您需要处理类似表格的文件时,我总是建议您使用pandas 以使您的代码更简洁且更易于扩展。

    使用下面的 sn-p 可以轻松完成您想要实现的目标:

    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
    

    【讨论】:

    • 那肯定是一个更简单的方法!对于现在的这个类,我们有非常严格的参数来决定我们可以使用什么和不可以使用什么。 Pandas 听起来很熟悉,因为我相信我们会在不久的将来使用它们。然而,这个作业主要是为了使用读写、格式化和类似的基本东西。我等不及我们可以使用更高效的东西了...谢谢!
    猜你喜欢
    • 2021-12-10
    • 2016-10-17
    • 2018-05-05
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多