2017-10-06 18 views
0

3つの列を持つ.txtファイルがあります。名前、身長、および体重。 BMIの4番目の列(特定の式から)を追加するだけでなく、各カテゴリの最小、最大、平均を見つける必要があります。新しいテキストと変数を.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()の使用や、自分のヘッダーを作る。何らかの理由で、 "in_file:line_str"行の上に独立ヘッダを印刷することもできません。この場合、私は自分の見出しを作って、必要な書式で行ごとに必要な結果を印刷します。非効率的だと思われます...

編集:アレッシオからの答えがトリックでした!それを考えなかっただろう!

+1

あなたは、読み取りモードでファイルを開いているので、それがかもしれません。 "in_file = open(" data.txt "、" r ")" –

+0

"何もできない"とはどういう意味ですか?確かに何かを印刷したり、トレースバックを与えたりします。 –

+0

申し訳ありません...はい、平均値などの必要な値を出力します。動作しないのは、テキストの最初の行をスキップして自分のヘッダーを作成するreadline()、または(そして、私は文字列で必要な各値を正しい書式で文字列で出力するつもりでしたが)何らかの理由で "in_fileのline_str"の上に印刷させません。 – Marty

答えて

0

こちらがお探しの解決策です。 "result"変数の他の列の右側に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

関連する問題