在应该从.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
答案 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())