2

次の入力があります。

ID,       Last,      First,   Lecture, Tutorial, A1,  A2, A3,   A4,  A5
10034567, Smith,     Winston, L01,     T03,      6,   5.5, 8,   10,  8.5
10045678, Lee,       Bruce,   L02,     T05,      4.5, 6.5, 7,   7,   8.5
00305678, Obama,     Jack,    L01,     T05,      10,  10,  9,   9.5, 10
00567890, Brown,     Palin,   L02,     T03,      4,   7.5, 6.5, 0,   5
10012134, Harper,    Ed,      L01,     T03,      10,  9,   7.5, 10,  6.5
10014549, Johnson,   Andrew,  L01,     T05,      10,  0,   10,  5.5, 7
10020987, Clockwork, Milan,   L02,     T03,      10,  8.5, 8,   9,   9
10021234, Freeman,   Skyski   L01,     T02,      0,   10,  10,  10,  8.5
EOF

ファイルの最初の行では、データの各列について説明しています。生徒の総数を n とすると、ファイルの次の n 行はそれぞれクラスの生徒に対応し、10 個のフィールドが含まれます。

  1. 学生証

  2. 苗字

  3. ファーストネーム

  4. 講義部門

  5. チュートリアルセクション

  6. 課題 1 の成績(など)

成績がファイルに保存されていると仮定するとgrades.txt、次の Python ステートメントを使用して、ファイルの行全体を Python 文字列 s に読み込むことができます。

file = open (‘grades.txt’, ‘r’)
s = file.readline()

ファイルを一度開くだけで、readline()関数を複数回使用して、毎回連続する行を読み取ることができます。n 行の生徒の記録の後、ファイルEOFEnd of File.

数 n は優先順位として知られていません。サンプル入力は、100 人から 300 人の学生を含むことができますが、grades.txt最終的には課題 1 の成績分布のヒストグラムを作成したいと考えています。したがって、各学生の A1 の成績を抽出する必要があります。ファイル内の対応する行。生徒ごとに 1 つのエントリを持つリストを作成し、A1 の成績を保存します。新しい A1 グレードを抽出するたびに、このリストに追加します。

これまでのところ、これは私がやったことです:

file = open('grades.txt','r')
s = file.readline()


for line in file:
    newline = str(line)
    grades = newline.split(",")
    if len(grades)<=4:
        break
    elif len(grades)>5:
        break
    else:
        grades = [float(x) for x in grades]
gradeA1 = grades[5]
print(gradeA1)

ただし6、連続した行の他の A1 グレードではなく、最初のグレードのみを取得します。すべての A1 グレードをリストにコンパイルする必要があります。

これを編集したコードとして持っていますが、それでもエラーが発生します。

file = open('grades.txt','r')
s = file.readline()

for s in file:
    s = file.readline()
    grades = s.split(",")
    if grades=='EOF\n':
        break
A1grades = [float(x) for x in grades[5]]   
print(A1grades)

範囲外のインデックス エラーが発生します。

4

3 に答える 3

1

私は誤解される可能性がありますが、この入力では:

ID,       Last,      First,   Lecture, Tutorial, A1,  A2, A3,   A4,  A5
10034567, Smith,     Winston, L01,     T03,      6,   5.5, 8,   10,  8.5
10045678, Lee,       Bruce,   L02,     T05,      4.5, 6.5, 7,   7,   8.5
00305678, Obama,     Jack,    L01,     T05,      10,  10,  9,   9.5, 10

そしてこの(の一部の)コード:

for line in file:
    newline = str(line)
    grades = newline.split(",")
    if len(grades)<=4:
        break
    elif len(grades)>5:
        break

正確に5列ある場合にのみループを続けます。10列を数えます(コンマで分割)。したがって、最初の行の直後に中断し(成績をフロートに変換しないでください)、最初の行からのみ結果を取得します。

コードには他にもいくつかの間違いがありますが、最初にこれを修正することをお勧めします。

ところで、これはPythonコース(質問の言い回しを参照)からのものだと思いますので、基本を学んでいるだけだと思います。そうでない場合、またはこれをより適切に実行したい場合は、KevinLを使用してCSVモジュールを使用します。

編集

新しいコードから(編集された質問内):

  1. をチェックする必要はありませんEOF。ファイル(for s in file)をループすることで、それが可能になります。

  2. for s in fileすでに行を読んでいます。もう一度する必要はありませんs = file.readline()

  3. 分割された線ごとに、グレードを見つけます。これを、最初に作成した(空の)別のリストに追加します。このリストには、A1グレードが含まれています。

    ファイル内のsのgrades=[]:columns = s.split( "、")grades.append(columns [5])

しかし:私はあなたが一歩下がって、あなたのコードが何をしているのか(または私のコード)、または何をする必要があるのか​​(コードではなく、言葉で言えば、段階的に)を非常に注意深く書く必要があると思います。プログラミングに関して(Pythonに関してさえも)あなたが見逃していることがたくさんあります。

これが宿題の場合は、これを行う他の人と話し合う方がよいでしょう。また、Pythonの家庭教師のメーリングリストがあり、より適している可能性があります。

不快感はありません。実際的なアドバイスをしようとしているだけです。

于 2012-11-09T10:07:54.047 に答える
1

適切な形式のデータの場合、csv モジュールは開始するのに適した場所です。そのためのドキュメントを読んで、試してみることをお勧めします。あなたを正しい方向へと導いてくれるはずです。それ以外の場合は、リストが何であるかについて混乱していると思います-最新の行からの結果のリスト、または行のリスト。コードは現在、各行で成績を再作成していますが、これはあなたがしようとしていることではないかもしれません...

于 2012-11-08T19:38:17.590 に答える
1

問題は、ファイルからすべての行を読み取っていない可能性があると思います...おそらく、このようなことができます

firstLine = file.readline()
#extract from first line, the number of lines that next

for x in range(1,number_of_line)
    line = file.readline()
    #process the information for all next lines

これはそれを行う方法です。これがあなたに役立つことを願っています...

于 2012-11-08T20:05:35.993 に答える