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 文件的示例:

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])它会返回正确的数字,因此它正在调用正确的文件。

第二次编辑

发现了问题,我喂它的“级别”实际上是str而不是int,感谢所有看过并提供帮助的人。

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

wheren += 1被留在循环之外n并且永远不会增加. 或者,n += 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,其中-tt告诉python查找制表符和空格的不一致使用,并在发现此类问题时引发错误。

您可以通过使用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()或阈值 ot 测试数据:)

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
def bounce(tickList,x):
    n = 0
    for i in tickList:
        if float(i[1]) < x:
            return n  # return float(i[1)
            n += 1
    return None

像这样的东西???

于 2013-07-19T19:49:02.660 回答
0

确保您没有在标识中混合空格和制表符。

这对我来说按预期工作(我编辑了原始函数以返回索引和元素值)。

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 回答
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 回答