2

ファイルから数値のリストを取得するプログラムを作成しようとしています (行とサイズが変わる可能性があります)。次に、すべての数値の合計と平均を出力します。設定された数の行読み取りがある場合、これを行うのに問題はありませんでしたが、行読み取りが実行ごとに変更される「適切な」方法で混乱しています。

これは私の進行中のコードです。少し読んで、ファイルをループして長さを見つける正しい(?)方法を見つけましたが、現在何らかのタイプのIOエラーをスローしているため、それを実装する方法がわかりません。助けてくれてありがとう!

def main():
    filename = input("Enter file name (name.txt):")
    try:
        file = open(filename, "r")
    except IOError:
        print("Error opening file!")

    totalLines = totalLineGet(filename)

    results = []
    for x in range(totalLines):
            results.append(getLineNumber(x+1, file))

    print("Total = ", numTotal)
    print("Average = ", numAvg)

def totalLineGet(_filename):
    count = 0
    _file = open(_filename, "r")
    for x in open(_file):
        count+= 1
    return count

def getLineNumber(linetoget, _file):
    try:
        intNumber = int(number = _file.readline())
    except ValueError:
        print("Error in file data!")

    return intNumber

main()
4

4 に答える 4

2

あなたが何をしたいのかわからない...しかし、あなたは1回のパスで答えを得ることができるはずです. enumerate()アイテム/行番号の数を知る必要がある場合は、反復可能なオブジェクト (この場合はファイル) に番号を付けるために使用できます。

1 行に 1 つの int() があると仮定すると、次のようになります。

with open(filename, "r") as in_f:
    numbers = []
    for line in in_f: 
        line = line.strip() # remove whitespace
        if line: # make sure there is something there
            number_on_line = int(line) 
            numbers.append(number_on_line)
    sum_of_numbers = sum(numbers)
    avg_of_numbers = sum(numbers)/len(numbers)

これがモジュールを使用して調べる必要がある CSV データの場合csv、行が行/列に分割されます。

import csv
filename = "somefile"
with open(filename, "rb") as in_f: # <-- notice "rb" is used
    reader = csv.reader(in_f)
    for row in reader:
        for col in row:
            # do stuff
            ...
于 2012-11-30T02:21:05.670 に答える
1

簡単な解決策、あなたがやりたいことをする...

filename = 'tmp.txt'
f = open(filename)
s, totnum = 0, 0
for line_number, line in enumerate(f):
    nums = map(int, line.split())
    s += sum(nums)
    totnum += len(nums)

print "numbers:", totnum, "average:", 1.0*s/totnum
于 2012-11-30T02:27:30.373 に答える
1

これは、ファイルの各行に文字ではなく数字のみが含まれていることを前提としていますTypeError

list_of_numbers = []

with open('somefile.txt') as f:
   for line in f:
      if line.strip(): # this skips blank lines
          list_of_numbers.append(int(line.strip()))

print 'Total ',len(list_of_numbers)
print 'Average ',1.0*sum(list_of_numbers)/len(list_of_numbers)
于 2012-11-30T02:45:48.387 に答える
1

あなたが望むことをする方法に関して、いくつかの良い答えがあります。IO エラーに関しては、input() ビルトインがユーザーの入力を評価しようとしますが、これは危険であり、必要なものではありません。

raw_input() ビルトインを使用してみてください。これは、ユーザーの入力を文字列として返します。楽しみのために、スクリプトを実行__name__してファイル名として指定し、何が起こるか見てみましょう。

于 2012-11-30T02:48:13.297 に答える