6

時間データと数値を含むcsvファイルがたくさんあります。この方法で、しきい値(x)を下回る数値の最初の出現を返す関数を作成しました:

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n
            break
        n += 1

この方法でバウンス関数の実行をループする場合を除いて:

for i in os.listdir(resultDir):

    if "csv" in i:
        csvFile = resultDir+i
        print csvFile
        with open(csvFile, 'rb') as f:
            reader = csv.reader(f)
            tickList = []
            for line in reader:
                tickList.append(line)

        print bounce(tickList,5)

最初の値がしきい値を超えていても、ゼロを返し続けます。

どこが間違っていますか?


csv ファイルの 1 つのサンプルを次に示します。

1373289767.454535,9.9
1373289769.728528,9.9
1373289771.817576,9.9
1373289773.813036,11.7
1373289775.810985,11.7
1373289777.769641,11.7
1373289779.783134,12.2
1373289781.774255,11.8
1373289783.799892,12.0
1373289785.812967,11.4
1373289787.816991,11.4
1373289789.790835,11.3
1373289791.811245,10.9
1373289793.880356,10.8
1373289795.846866,10.7
1373289797.847552,10.6
1373289799.858929,10.6

前もって感謝します 。

コメントの後に編集

新しい関数は次のとおりです。

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n 
        n += 1

float(i[1])を出力すると、正しい数値が返されるため、正しいファイルが呼び出されます。

2回目の編集

問題が見つかりました。私が与えていた「レベル」は、実際にはintではなくstrでした。見て助けてくれたみんなに感謝します。

4

5 に答える 5

2

インデントが間違っていると強く思います。スペースとタブを混在させることにより、Python はメソッドを次のように解釈します

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n
            break
    n += 1

whereはループのn += 1に残され、インクリメントされることはありません。または、インデントが大きすぎる可能性があります。nn += 1

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n
            break
            n += 1

あなたの関数は、以下0の行がある場合に戻ります。float(i[1])x

でスクリプトを実行することで、このような問題をテストできますpython -tt scriptname.py。ここで、-ttPython にタブとスペースの一貫性のない使用を探し、そのような問題が見つかった場合はエラーを発生させるように指示します。

enumerate()を使用し、テストをインライン化し、ファイルの読み取りを早期に終了することで、コードを簡素化できます。

for fname in os.listdir(resultDir):
    if "csv" in fname:
        csvFile = os.path.join(resultDir, fname)
        print csvFile
        with open(csvFile, 'rb') as f:
            reader = csv.reader(f)
            for i, row in enumerate(reader)
                if float(row[1]) < 5:
                    print i
                    break    # exit for loop, continue with next file

内側のループは、ジェネレータ式forを使用してさらに単純化できます。next()

with open(csvFile, 'rb') as f:
    reader = csv.reader(f)
    print next((i for i, r in enumerate(reader) if float(r[1]) < 5), 'Not found')

asは、結果が見つかるとnext() ループを停止します。

于 2013-07-19T19:54:32.547 に答える
1

しきい値を下回る値が必要であり、それがまさにコードの内容です。しかし、しきい値を超える値を期待した後。テストデータの変更bounce()またはしきい値:)

import csv

def bounce(tickList,x):
    n = 0
    for i in tickList:
        #print float(i[1])
        if float(i[1]) > x:
            return n
        n += 1

csvFile = 'test.csv'
print csvFile
tickList = []
with open(csvFile, 'rb') as f:
    reader = csv.reader(f)
    for line in reader:
        tickList.append(line)

print bounce(tickList,5)

このコードは0.

于 2013-07-19T19:53:30.303 に答える
0

データ全体をメモリに入れる必要があるとは確信していないので、次のような単純なものかもしれません。

reader = enumerate(csv.reader(f))
idx, row = next((r for r in reader if float(r[1][1]) < 5), (None, None))
于 2013-07-19T19:55:19.417 に答える
0

ID にスペースとタブが混在していないことを確認してください。

これは私にとっては期待どおりに機能します (インデックスと要素値の両方を返すように元の関数を編集しました)。

def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return (n, i[1])
        n += 1
于 2013-07-19T20:05:11.060 に答える