1

したがって、私はPython(および一般的なコーディング)にかなり慣れていないため、コード内の問題を見つけるために深刻な助けを借りることができます。基本的に、私は任意の数の学生名とそれに続く 4 つのテストスコアを含むファイルを開いています。だからこのようなもの:

John
78.0
80.0
69.0
98.0
Bob
40.0
78.0
77.0
89.0
etc

私のプログラムは、上記のファイルを読み取り、シェルに出力することを想定しています。

  John: 78.0 80.0 69.0 98.0 Average: 81.25
  Bob: 40.0 78.0 77.0 89.0 Average: 71.0

そして最後に、名前と平均を次のような新しいファイルに保存する必要があります。

  John,81.25
  Bob, 71.0

ただし、私のプログラムはこれを画面に出力します。

Mary
 :76.0 89.0 82.0 100.0 Average: 86.75
Joey
 :91.0 81.0 83.0 95.0 Average: 87.5
Sally
 :92.0 93.0 90.0 97.0 Average: 93.0

そして、次のようなファイルを保存しています:

  Mary
  86.75Joey
  87.5Sally
  93.0

誰でもこれらの問題のいずれかを助けることができますか? 学校の課題なので、私の悪いコーディングを特定するだけで十分です。

これが私のコードの混乱です:

学生のスコアを含むファイルを作成する

scoresa = open('project3-scoresa.txt','w')
scoresa.write("Mary\n76\n89\n82\n100\nJoey\n91\n81\n83\n95\nSally\n92\n93\n90\n97")
scoresa.close()



def main():
    averages = open("averages.csv","w")
    file = input("Please enter the scores filename:")
    try:
        scores = open(file,'r')
        print("File",file,"has been opened")
    except IOError:
        print("File",file,"could not be opened.")
    scores = open(file,'r')
    i = 0
    for line in scores:
        if i%5 == 0:
            name = line
            print(name.strip("/n"),":", end="")
            j = 1
            total = 0
        else:
            score = float(line)
            print(score, end=" ")
            total += score
            ave = total/j
            if j == 4:
                print("Average:",ave)
                Avestring = (name + str(ave))
                averages.write(Avestring)
            j += 1
        i += 1
    scores.close()
    averages.close()
    average = open("averages.csv","r")
    for line in average:
        print(line.strip("\n"))
main()
4

3 に答える 3

1

あなたはとても近くにいます。これを試して。

def main():
    averages = open("averages.csv","w")
    file = input("Please enter the scores filename:")
    try:
        scores = open(file,'r')
        print("File",file,"has been opened")
    except IOError:
        print("File",file,"could not be opened.")
    scores = open(file,'r')
    i = 0
    for line in scores:
        if i%5 == 0:
            name = line.strip("\n")
            print(name,":", end="")
            j = 1
            total = 0
        else:
            score = float(line)
            print(score, end=" ")
            total += score
            ave = total/j
            if j == 4:
                print("Average:",ave)
                Avestring = (name + "," + str(ave) + "\n")
                averages.write(Avestring)
            j += 1
        i += 1
    scores.close()
    averages.close()
    average = open("averages.csv","r")
    for line in average:
        print(line.strip("\n"))
main()

主な変更点は次のとおりです。

name = line.strip("\n") # note the \n not /n
print(name,":", end="")

Avestring = (name + "," + str(ave) + "\n") # note the comma and line break.
于 2016-03-28T00:54:00.850 に答える
0

この行にタイプミスがあります:

print(name.strip("/n"),":", end="")

\nつまり、(改行文字を示すエスケープ シーケンス) を使用する必要があります。/n

これは、印刷時に改行文字が名前から削除されないことを意味します。そのため、次のような出力が得られます。

Mary
 :76.0 89.0 82.0 100.0 Average: 86.75

これではなく:

Mary:76.0 89.0 82.0 100.0 Average: 86.75

:(ターゲット出力を取得するには、の後にスペースを追加する必要があることに注意してください)

name.strip('\n')使用していたとしても(つまり、タイプミスなしで)、ファイルへの書き込み時に2番目の問題が発生することに注意してください。呼び出しstrip()てもそれ自体nameの値は変更されないため、変更してnameも改行文字はそのままnameです。

Avestring = (name + str(ave))
averages.write(Avestring)

あなたの値を更新するには、次のnameようにします。

name = name.split('\n')

これは の古い値を取り、それをname呼び出しsplit()、返された結果を に格納しnameます。

ただし、この場合、次のように簡単に実行できます。

name = line.split('\n')

改行文字を含む名前は必要ないため、すぐに削除することもできます。

于 2016-03-28T00:52:29.000 に答える
0

最初の問題は、20 行目の「/n」を「\n」に置き換えることで解決できます。

 print(name.strip("/n"),":", end="")

これは次のようになります。

 print(name.strip("\n"),":", end="")

そして、私が行った他の変更は、行番号 19 と 30 でした。最初に、改行文字の文字列を取り除きました。コードの新しい行は になります。

name = line.strip("\n")
Avestring = (name +","+ str(ave)+ "\n")
于 2016-03-28T00:54:50.017 に答える