0

代码应该从 .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
4

2 回答 2

0

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

于 2013-09-11T23:16:35.503 回答
0

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

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

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

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

哪条线?好吧,您给出的示例中没有一个。

最有可能的是,您的真实文件末尾有类似空行的内容,因此w以单元素 list 结尾['']

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

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

或者……</p>

要真正找出问题而不仅仅是猜测,您需要使用调试器或交互式可视化工具进行调试,或者只是添加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())
于 2013-09-11T23:37:34.383 回答