2017-10-06 3 views
0

Nous avons un fichier .txt avec 3 colonnes; nom, taille et poids. Nous devons ajouter une 4ème colonne pour l'IMC (à partir d'une formule donnée) ainsi que trouver les min, max et moyenne de chaque catégorie.Comment ajouter un nouveau texte et des variables à un fichier .txt

Le texte provient d'un fichier local, "data.txt." Voici le texte (fait dans le bloc de code pour conserver le formatage pour l'imprimer):

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 

Voici le code que j'ai jusqu'à présent, qui le montre la plupart du temps complet, à l'exception de la colonne IMC:

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)) 

Tout ce que je dois faire est d'avoir une colonne avec l'en-tête BMI, et toutes les valeurs d'IMC ajoutées à chaque ligne_str, mais ne peut rien faire fonctionner, comme l'utilisation de readline() pour ignorer la première ligne, et I ' d fais mon propre en-tête. Je ne peux pas non plus imprimer un en-tête indépendant au-dessus de la ligne "for line_str in in_file:" pour une raison quelconque; dans ce cas, j'allais juste faire mon propre en-tête, puis imprimer les résultats dont j'avais besoin ligne par ligne avec le format dont j'avais besoin. Semble inefficace ...

Editer: La réponse d'Alessio a fait l'affaire! Je n'aurais pas pensé à ça!

+1

Il peut être parce que vous avez ouvert le fichier en mode lecture. "in_file = open (" data.txt "," r ")" –

+0

Que voulez-vous dire par "ne peut rien faire pour travailler"? Sûrement il imprime quelque chose ou vous donne un retraçage. –

+0

Désolé ... Oui, Il imprime les valeurs dont j'ai besoin, telles que les moyennes, etc. Ce qui ne fonctionne pas, essaie readline() de sauter la première ligne de texte et de faire mon propre en-tête, ou d'imprimer un nouvelle ligne au-dessus du fichier texte (et puis j'allais juste imprimer chaque valeur que j'ai besoin chaîne par chaîne avec le formatage correct) mais il ne me laissera pas imprimer au-dessus de "line_str in_file" pour une raison quelconque – Marty

Répondre

0

Ici, cela peut être la solution que vous recherchiez. Affiche la colonne BMI à droite des autres colonnes de la variable "result". Une fois que vous l'avez fait, vous pouvez tout faire de l'écrire dans un fichier ou l'imprimer sur la console (comme je l'ai fait :)). Si vous avez besoin d'ajouter d'autres colonnes, il suffit de suivre l'exemple :)

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

Chaque fois que vous devez traiter les dossiers comme la table, je toujours vous suggère d'utiliser pandas afin de rendre votre code plus propre et plus facile étendre.

Qu'est-ce que vous voulez réaliser est facilement fait en utilisant l'extrait ci-dessous:

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()) 

Sortie:

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

Ce serait certainement un moyen plus facile! Pour cette classe en ce moment, nous avons des paramètres assez stricts sur ce que nous pouvons et ne pouvons pas utiliser. Les pandas sont quelque chose qui me semble familier, car je crois que nous les utiliserons dans un proche avenir. Cette mission, cependant, était surtout d'utiliser la lecture et l'écriture, le formatage, et des trucs vraiment basiques comme ça. Je ne peux pas attendre jusqu'à ce que nous puissions utiliser des trucs plus efficaces ... Merci! – Marty