I have a bunch of csv files containing time data and numbers, I wrote a function to return the first occurrence of a number below a threshold (x) this way :
def bounce(tickList,x):
n = 0
for i in tickList:
if float(i[1]) < x:
return n
break
n += 1
except that when I loop the execution of the bounce function this way :
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)
it keeps on returning zero (even though the first value is above the threshold ) .
Where am I going wrong ?
Here is a sample of one of the csv files :
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
Thanks in advance .
EDIT after comments
Here is the new function:
def bounce(tickList,x):
n = 0
for i in tickList:
if float(i[1]) < x:
return n
n += 1
if I print float(i[1]) it returns the right numbers so it is calling the right files .
SECOND EDIT
found the problem, the "level" I was feeding it was in fact a str and not an int, thanks for everybody who had a look and helped .
I strongly suspect that your indentation is incorrect, and by mixing spaces and tabs Python interprets your method as:
def bounce(tickList,x):
n = 0
for i in tickList:
if float(i[1]) < x:
return n
break
n += 1
where n += 1
is left outside the loop and never increments n
. Alternatively, n += 1
could be indented too far:
def bounce(tickList,x):
n = 0
for i in tickList:
if float(i[1]) < x:
return n
break
n += 1
Your function would return 0
for any case where there is a row with float(i[1])
below x
.
You can test for such problems by running your script with python -tt scriptname.py
, where -tt
tells python to look for inconsistent use of tabs and spaces and raise an error if it finds such problems.
You can simplify your code by using enumerate()
, and inlining the test, exiting reading the file early:
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
The inner for
loop can be simplified down further by using next()
and an generator expression:
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()
stops looping once a result has been found.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With