我有一堆包含时间数据和数字的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 ,感谢所有看过并帮助过的人。 / p>
答案 0 :(得分:2)
我强烈怀疑您的缩进不正确,并且通过混合空格和制表符,Python会将您的方法解释为:
def bounce(tickList,x):
n = 0
for i in tickList:
if float(i[1]) < x:
return n
break
n += 1
其中n += 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')
,next()
在找到结果后停止循环。
答案 1 :(得分: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
。
答案 2 :(得分: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
这样的东西???
答案 3 :(得分:0)
我不相信你需要将整个数据存入内存,所以也许就像这样简单:
reader = enumerate(csv.reader(f))
idx, row = next((r for r in reader if float(r[1][1]) < 5), (None, None))
答案 4 :(得分:0)
确保您没有在标识中混合空格和制表符。
这对我有用(我编辑了原始函数以返回索引和元素值)。
def bounce(tickList,x):
n = 0
for i in tickList:
if float(i[1]) < x:
return (n, i[1])
n += 1