2016-05-04 7 views
1

それはエラーになりますように私はTOTAL_NUM()関数の中で立ち往生してきたPython用のテキストファイルに合計数を追加するにはどうすればよいですか?

「とValueError:ベース付)(int型のための無効なリテラル10: 『』」

は私があればそれを行う方法を知っていますその定義済みのリストが、私が混乱するユーザーによって設定されている場合。

def total_num(): 
    total = 0 
    num_file = open("num_list.txt", "r") 
    line = num_file.read() 

    while line != "": 
     num1 = int(num_file.readline()) 

     total = total + num1 

    print total 


def read_num(): 
    num_file = open("num_list.txt", "r") 

    for line in num_file: 
     print line.rstrip("\n") 

def write_num(): 
    num = input("Enter a number: ") 
    num_file = open("num_list.txt", "w") 
    num_consec = 0 

    for x in range(num): 
     num_consec = num_consec + 1 
     num_file.write(str(num_consec)+ "\n") 

    num_file.close() 

def main(): 
    write_num() 
    read_num() 
    total_num() 


main() 
+0

は、ファイルが実際に単に数字や空白行を持っているときのために働い例 – e4c5

答えて

1

エラーは、テキストファイルから空の文字列が取得されているためです。このコードを見てください。ファイル全体をメモリに読み込んでいます。こっち

line = num_file.read() 

while line != "": 

、あなたは空の文字列で、ファイル全体を比較しているline != ""空のファイルを開いた場合を除きます。だから、あなたのnum1 = int(num_file.readline())がファイルから空の行を読み込むまでループを続けます。

read_numメソッドを見れば解決策が見つかります。

for line in num_file: 
    try: 
     total += int(line) 
    except ValueError: 
     print "Invalid data in ", line 

try exceptを使用することにより、ファイルを他の不正なテキストが含まれている可能性がある状況を処理することができます。

+0

それとも超短、超高速バージョンを(示す私の答えを更新しました): 'total = sum(map(int、filter(str.strip、num_file)))';空行が問題にならない場合は 'filter'を省略することができます。 – ShadowRanger

+0

偉大な答え@ ShadowRangerあなたがそれを投稿する場合私はupvoteします。私の場合は、OPが依然として彼の方法を見つけているので、私はそれを簡単に保つことを望んでいました。 – e4c5

0

ファイルを奇妙な方法で読んでいます。つまり、2回です。 read()は、ファイルの内容全体を文字列に変換します。文字があるかどうかを繰り返しチェックしてから変更しないと、無限に実行されたりループされたりしません。

数値を取得するにはinput()を使用しますが、raw_input()を使用し、安全のためにint()とキャストする方が良いです。また、xrange()は、Python 2のrange()よりも優れています。すでにrange()を反復している場合は、手動カウンタを保持する必要はありません。

全体的に、あなたのコードは、これに凝縮することができます

def write_num(): 
    num = int(raw_input("Enter a number: ")) 
    with open("num_list.txt", "w") as output: 
    for x in xrange(1, num+1): 
     output.write(str(x) + "\n") 

def read_num(): 
    with open("num_list.txt") as f: 
     numbers = map(int, f) 
     for number in numbers: 
      print number 
     return numbers 

def main(): 
    write_num() 
    print sum(read_num()) 

main() 
関連する問題