Python指数超出现金流范围

Python指数超出现金流范围,python,indexing,Python,Indexing,代码应该从.txt文件中读取逗号分隔的值,根据负数排序到数组中,然后打印数据。 下面是代码,后面是2.txt文件,第一个有效,但第二个无效 #check python is working print "hello world" #import ability to plot and use matrices import matplotlib.pylab as plt import numpy as np #declare variables posdata=[] negdata=[] p

代码应该从.txt文件中读取逗号分隔的值,根据负数排序到数组中,然后打印数据。 下面是代码,后面是2.txt文件,第一个有效,但第二个无效

#check python is working
print "hello world"

#import ability to plot and use matrices
import matplotlib.pylab as plt
import numpy as np

#declare variables
posdata=[]
negdata=[]
postime=[]
negtime=[]
interestrate=.025


#open file
f= open('/Users/zacharygastony/Desktop/CashFlow_2.txt','r')
data = f.readlines()

#split data into arrays
for y in data:
    w= y.split(",")
    if float(w[1])>0:
        postime.append(int(w[0]))
        posdata.append(float(w[1]))
    else:
        negtime.append(int(w[0]))
        negdata.append(float(w[1]))

print "Inflow Total: ", posdata
print "Inflow Time: ", postime
print "Outflow Total: ", negdata
print "Outflow Time: ", negtime

#plot the data
N=len(postime)
M=len(negtime)

ind = np.arange(N+M)  # the x locations for the groups
width = 0.35       # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(ind, posdata+negdata, width, color='r')

# add some
ax.set_ylabel('Cash Amount')
ax.set_title('Cash Flow Diagram')
ax.set_xlabel('Time')

plt.plot(xrange(0,M+N))
plt.show()'
.txt 1

0,3761.97
1,-1000
2,-1000
3,-1000
4,-1000
0,1000
1,-1000
2,1000
3,-1000
.txt 2

0,3761.97
1,-1000
2,-1000
3,-1000
4,-1000
0,1000
1,-1000
2,1000
3,-1000
我的错误如下:

>>> runfile('/Users/zacharygastony/cashflow.py', wdir=r'/Users/zacharygastony')
hello world
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/zacharygastony/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
execfile(filename, namespace)
  File "/Users/zacharygastony/cashflow.py", line 24, in <module>
    if float(w[1])>0:
IndexError: list index out of range
>>运行文件('/Users/zacharygastony/cashflow.py',wdir=r'/Users/zacharygastony')
你好,世界
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/zacharygastony/anaconda/lib/python2.7/site packages/spyderlib/widgets/externalshell/sitecustomize.py”,第540行,在runfile中
execfile(文件名、命名空间)
文件“/Users/zacharygastony/cashflow.py”,第24行,在
如果浮动(w[1])>0:
索引器:列表索引超出范围

我可以发现的一个错误是“if float(w[1])>0:”--应该考虑到w[1]是由两个值组成的一组,由一个空格分隔。下面是第二个文件的w的外观:“['0'、'10001'、'-10002'、'10003'、'-1000\n']”。因此,w[1]将是“10001”,对该值采用浮点将是一个错误。因此,如果您真的想访问第二个元素,那么一种方法是使用默认的空格分隔符拆分它,然后选择第一个(或第二个)。类似于:“如果float((w[1].split())[0])>0:”。

没有实际的文件(或者更好的是,没有显示相同问题的文件),则无法确切确定出了什么问题。当我使用您的确切数据运行您的代码(只是更改硬编码的路径名)时,一切正常

但是,如果
如果float(w[1])>0:
正在引发一个
索引器,那么显然
w
只有0或1个元素

由于
w
来自
w=y.split(“,”
),这意味着
y
中没有任何逗号

由于
y
是文件中的每一行,其中一行没有任何逗号

哪一行?你举的例子中没有一个

最有可能的是,您的真实文件末尾有一个类似于空行的东西,因此
w
以单元素列表
['']
结尾

或者……可能
2\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

或者,您运行的实际文件是一个较长的手工编辑文件,您在其中的某个位置键入了一个错误,例如
4.1000
,而不是
41000

或者

要真正解决问题,而不是仅仅猜测,您需要使用调试器或交互式可视化工具进行调试,或者只是添加
print
语句来记录所有中间值:

print(y)
w= y.split(",")
print(w)
w1 = w[1]
print(w1)
f = float(w1)
print(f)
if f>0:
    # ...

因此,您的实际问题是文件末尾的空行。你怎么处理这个问题

您可以跳过空行,或者跳过没有足够逗号的行,或者只处理异常并继续

例如,让我们跳过空行。请注意,
readlines
将换行符保留在末尾,因此它们实际上不会是空的,它们将是
'\n'
,或者根据您的平台和Python版本,可能是类似
'\r\n'
的其他内容。但实际上,你可能也想跳过一行只有空格的行,对吗?因此,我们只需在其上调用
strip
,如果结果为空,则跳过该行:

for y in data:
    if not y.strip():
        continue
    w = y.split(",")
如果您更喜欢预处理,您可以:

data = f.readlines()
data = [line for line in data if line.strip()]
问题是,在读取整个文件并搜索要拆分的换行符并建立一个大列表(所有这些都是您刚才通过调用
readlines
)所做的)的基础上,您现在还要再次查看整个列表并建立另一个列表。在你开始之前。没有理由这么做

您可以在一个文件上迭代,而无需对其调用
readlines
,这样就可以根据需要获取行

您可以使用生成器表达式而不是列表理解来进行“预处理”,而无需事先进行实际工作。因此:

data = (line for line in f if line.strip())

作为补充,如果您在读取和解析CSV文件时遇到困难(或者,实际上,即使您没有)在标准库和/或NUMPY的CSV功能中,您应该考虑使用<代码> CSV < /Cult>模块,而不是试图用手工来完成。结果不工作的原因是因为我的.txt文件在底部没有额外的新行,我没有看到。有没有可能写一封信,通过并删除空行?@ZacharyGastony:当然有。但是为什么不直接做呢?让我编辑我的答案来告诉你我的意思。结果证明它不起作用的原因是因为我的.txt文件在底部有额外的空行,我没有看到。如果我的“如果”语句第一个是空的,是否可以检查它,如果是空的,是否可以忽略这些行?我确实想到了这一点,但是当w[1]是两个词时,我没有去那里!为了忽略这些线,我们总是可以检查w的长度是否为零。。例如:“if len(w)==0:continue”仔细想想,因为您使用的是w[1],所以您可能应该检查w至少有两个元素:“if len(w)<2:continue”