Python指数超出现金流量范围

时间:2013-09-11 23:05:04

标签: 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=[]
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

.txt 2_ _ __ _ _

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

2 个答案:

答案 0 :(得分:0)

我可以发现的一个错误是“if float(w [1])&gt; 0:” - 它考虑到w [1]将是由空格分隔的两个值的集合。以下是第二个文件的w样式:“['0','1000 1',' - 1000 2','1000 3',' - 1000 \ n']”。因此,w [1]将为“1000 1”并且为此值采用浮点数将是一个错误。因此,如果您真的想要访问第二个元素,那么一种方法是使用默认空格分隔符将其拆分并选择第一个元素(或第二个元素)。类似于:“if float(([[[1] .split())[0])&gt; 0:”。

答案 1 :(得分:0)

如果没有你的实际文件(或者更好的是,SSCCE表明同样的问题),就没有办法确切地知道出了什么问题。当我使用您的确切数据运行您的代码(只是更改硬编码路径名)时,一切正常。

但是,如果if float(w[1])>0:提出IndexError,则w只有0或1个元素。

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

由于y是您文件中的每一行,因此其中一行没有逗号。

哪条线?好吧,在你给出的例子中没有一个。

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

或者......也许2______实际上是文件顶部的标题行,在这种情况下,w最终会为['2______']

或者您正在运行的实际文件是一个较长的手工编辑文件,您在某处犯了错字,例如4.1000而不是4,1000

或者...

要实际找出问题而不仅仅是猜测,您需要使用调试器或交互式可视化工具进行调试,或者只需添加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),你're 现在再次遍历整个列表并构建另一个列表。在你开始之前就已经完成了所有这些。而且没有理由这样做。

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

您可以使用生成器表达式而不是列表推导来“预处理”,而无需事先实际完成工作。所以:

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