2017-10-16 11 views
1

3行以上のテキストを処理しようとしましたが、2つは現在正しく機能していません。なぜforループはすべての私のreadlineを通って走りませんか?

テキストファイルは、ここで

74,85,65,56 
97,67,83,96 

である私は、出力は私が取得しています何

Your average is: 70.0 
Your average is: 85.75 

でなければなりません

file = open('grades.txt','r') 
for x in file: 
    read = file.readline() 
    sep = read.split(",") 
def toNumbers(): 
    changeNum = [eval(x) for x in sep] 
    return changeNum 
def sumlist(): 
    total = 0 
    sum(pls) 
    average = sum(pls)/len(sep) 
    print ("Your average is: ", average) 
def main(): 
    sumlist() 
pls = toNumbers() 
main() 

に取り組んできたコードはこれだけです

Your average is: 85.75 

私は私のテキストファイルに3行目に追加したとき、私は

SyntaxError: unexpected EOF while parsing 

このエラーを取得する三行目は、テキストファイル内の数値だけの行で、そこ

74,85,65,56 
97,67,83,96 
10,20,30,40 

から続けることができます出力は

Your average is: 70.0 
Your average is: 85.75 
Your average is: 25.0 
+0

を三行目が何であるかを明記してください。 –

+0

すべてのループで 'sep'を上書きしているようです。 –

+0

@EamonnKenny私はあなたのために私のポストを編集しました。 – kengu

答えて

2

私はそれが本当にあなたの例で必要とされないようごmain機能を削除し、ループ自体のためでtoNumberssumlistを呼び出します。あなたが関数の引数として変数を渡す必要があることに注意してください:

def toNumbers(sep): 
    changeNum = [int(x) for x in sep] 
    return changeNum 

def sumlist(pls,sep): 
    average = sum(pls)/len(sep) 
    print ("Your average is: ", average) 


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

lines = file.readlines() 
for line in lines: 
    sep = line.split(",") 

    pls = toNumbers(sep) 
    sumlist(pls,sep) 

これは与える:

Your average is: 70.0 
Your average is: 85.75 
+0

ありがとう!これは、私がやっていたことよりずっと簡単です。私は参照のための例をたくさん見ていて、私が機能を使用していた場合、それらが 'main'のように必要なものだと思っていました。私はあまり遠く離れていませんでしたか? – kengu

+0

@kengu問題はありません:) Pythonはコードの可読性を重視する言語です。したがって、(一般的に)あなたのコードを読むのが簡単になればなるほど、それは優れています。これがあなたの問題を解決するならば、アップホートと答えを忘れないでください。 – DavidG

+0

[This](https://www.python.org/dev/peps/pep-0020/)も便利かもしれません:) – DavidG

3

です。これは簡単です。あなたのファイルの行を超える

for x in file: 

はすでに反復処理していますが、最初の行の内容であるxの値を無視しています。あなたは、単にあなたと二行目の内容をつかむ:何をするのPythonを告げたことはfor each line in the file, read next lineであるため、別の行を追加し

read = file.readline() 

は、エラーの原因となるので、forループがxにすべての奇数ラインを取り、その後、すべての偶数ラインがありますreadに保存されています。したがって、偶数行のファイルだけがエラーなしで処理されます。
あなたはこれをしたい:

for read in file: 
    sep = read.split(",") 

EDIT:コンプリート例:

def toNumbers(sep): 
    changeNum = [float(x) for x in sep] 
    return changeNum 

def sumlist(sep): 
    total = 0 
    sum(pls) 
    average = sum(pls)/len(sep) 
    print ("Your average is: ", average) 

def main(): 
    file = open('grades.txt','r') 
    for read in file: 
     sep = read.split(",") 
     sep = toNumbers(sep) 
     sumlist(sep) 

main() 
+0

私はあなたの平均の出力を取得しています:85.75まだ。 – kengu

+0

@kengu完全な例を見てください。あなたは常に 'sep'の内容を上書きしています。また、入力に 'eval'を使用することは決してありません。任意のコードを実行することができます。 – ElmoVanKielmo

+0

私は 'sep'で何が問題なのか分かりません。すべてを一度に割り当てる方が簡単でしょうか?あなたがそれを行うことができれば、次回は 'eval'のために気をつけます。ありがとう! – kengu

1

あなたもpythonで私のために実行されません。上記の持っているコードは3しかしへのreadlineを変更以下のようなreadlineは完全に機能しました。

lines = file.readlines() 
for line in lines: 
    sep = line.split(",") 
+0

これは私が今取得している 'AttributeError: 'list'オブジェクトに 'split''属性がありません。私はreadlinesを分割する前に試しましたが、何らかの理由で私のために働かないでしょう – kengu

1

あなたはforループ上fileを使用し、各ステップでfile.readline()を使用するため、問題があります。そのため、3行目にエラーが表示されるのはそのためです。別の行、4行を追加しようとすると、最後の行が表示されます。

readsepを印刷すると役立ちます。 コードを使用していることに気付くと、sep割り当てのために最新の行のみが表示されます。

このコードは、以下のあなたが望むものを達成するであろう:

file = open('sample.txt','r') 

raw_lines = file.readlines() 
lines = [raw_line.strip() for raw_line in raw_lines] 


def show_avg_per_line(line): 
    line_list = list(map(int, line.split(","))) 
    average = sum(line_list)/len(line_list) 
    print("Your average is: ", average) 

for line in lines: 
    show_avg_per_line(line) 
+0

これは意味があります。私は最初の2つにとても不満を抱いていたので、4行目!そして私は自分のインプットを印刷して、彼らがどこにいるのかを見ていましたが、それはもっと混乱していました。ありがとう、結構です! – kengu

関連する問題