0

ファイル名の入力を促すプログラムを作成し、ファイル全体を読み込んで次の形式の行を探します。 X-DSPAM-Confidence: 0.8475 「X-DSPAM-Confidence:」で始まる行に遭遇したら、行上の浮動小数点数を抽出します。これらの行を数えて、これらの行からスパム信頼値の合計を計算します。ファイルの最後に到達したら、平均スパム信頼度を出力します。

ファイル名を入力してください: mbox.txt
平均スパム信頼度: 0.894128046745

ファイル名を入力してください: mbox-short.txt
平均スパム信頼度: 0.750718518519 mbox.txt および mbox-short.txt ファイルでファイルをテストします。

これまでのところ、私は持っています:

 fname = raw_input("Enter file name: ")
 fh = open(fname)
 for line in fh:
     pos  = fh.find(':0.750718518519')
     x = float(fh[pos:])
     print x

このコードの何が問題になっていますか?

4

2 に答える 2

4

見つけるのではなく、すべての 'X-DSPAM-Confidence' 数値を平均するよう求めているようです0.750718518519

個人的には、探している単語を見つけて数字を抽出し、これらすべての数字をリストに入れて、最後に平均化します。

このようなもの -

# Get the filename from the user
filename = raw_input("Enter file name: ")

# An empty list to contain all our floats
spamflts = []

# Open the file to read ('r'), and loop through each line
for line in open(filename, 'r'):

    # If the line starts with the text we want (with all whitespace stripped)
    if line.strip().startswith('X-DSPAM-Confidence'):

        # Then extract the number from the second half of the line
        # "text:number".split(':') will give you ['text', 'number']
        # So you use [1] to get the second half
        # Then we use .strip() to remove whitespace, and convert to a float
        flt = float(line.split(':')[1].strip())

        print flt

        # We then add the number to our list
        spamflts.append(flt)

print spamflts
# At the end of the loop, we work out the average - the sum divided by the length
average = sum(spamflts)/len(spamflts)

print average

>>> lines = """X-DSPAM-Confidence: 1
X-DSPAM-Confidence: 5
Nothing on this line
X-DSPAM-Confidence: 4"""

>>> for line in lines.splitlines():
    print line


X-DSPAM-Confidence: 1
X-DSPAM-Confidence: 5
Nothing on this line
X-DSPAM-Confidence: 4

検索の使用:

>>> for line in lines.splitlines():
    pos = line.find('X-DSPAM-Confidence:')
    print pos

0
0
-1
0

各行find()の位置を示しているだけで、その後の数値の位置を示していないことがわかります。'X-DSPAM-Confidence:'

行が で始まる場合は見つけやすく'X-DSPAM-Confidence:'、次のように番号だけを抽出します。

>>> for line in lines.splitlines():
    print line.startswith('X-DSPAM-Confidence')


True
True
False
True

>>> for line in lines.splitlines():
    if line.startswith('X-DSPAM-Confidence'):
        print line.split(':')


['X-DSPAM-Confidence', ' 1']
['X-DSPAM-Confidence', ' 5']
['X-DSPAM-Confidence', ' 4']

>>> for line in lines.splitlines():
    if line.startswith('X-DSPAM-Confidence'):
        print float(line.split(':')[1])


1.0
5.0
4.0
于 2013-01-24T05:55:43.013 に答える
-1

line.find#..... だからあなたは行を検索します ....

print pos #prints はデバッグに役立ちます ;)

float(fh[pos+1:])#取得したインデックスは実際には : であるため、さらに 1 つ移動する必要があります

于 2013-01-24T05:55:10.370 に答える