csv 有没有办法检查为什么我得到一个索引超出范围的错误?

4ktjp1zp  于 2023-04-27  发布在  其他
关注(0)|答案(4)|浏览(126)

我试图从csv文件中提取数据,并在Python中使用matplotlib在程序中绘制它。csv文件是3列,中间两列之间有一个空格,我试图将每列排序到列表中,但它告诉我两列的列表索引超出范围。
我尝试过各种各样的修改,并尝试使用字典,但我对python的能力不是很好,因为我对它不是很熟悉。
这是我的代码中剩下的内容

import matplotlib.pyplot as plt
import csv

plt.grid(which='major')   
plt.xlim(140,300)
plt.ylim(0,90)
plt.ylabel(r'Altitude [km]')
plt.xlabel('Temperature [K]')

ALT = []
T = []

with open('atmoprofile.csv','r') as csvfile:
    lines = csv.reader(csvfile)
    for col in lines:
        T.append((col[0]))
        ALT.append((col[2]))

print(ALT)
print(T)

plt.plot(T,ALT, color = 'm' , marker = '.')
plt.savefig('FIG3.1.png',dpi=300)

并且误差如下

line 19, in <module>
    T.append((col[2]))
IndexError: list index out of range

这是一些csv文件

0.0000000000000000 295.38598510303814 2.1301675254755913E-002
0.50000000000000000 293.34076715919269 1.8661556016220760E-002
1.0000000000000000 291.26698316703533 1.6456139406729336E-002
1.5000000000000000 289.15220287599828 1.4345195644685916E-002
2.0000000000000000 286.97824981214990 1.2453493432569643E-002
2.5000000000000000 284.76134910419995 1.0778799478271171E-002
3.0000000000000000 282.47997944552532 9.1857871206039686E-003
3.5000000000000000 280.14277632253931 7.8700783601433066E-003
a8jjtwal

a8jjtwal1#

有没有办法检查为什么我得到一个索引超出范围的错误?
是的。你可以在循环中添加一个print(col),看看它实际上是什么样子,里面有多少个元素。

pvabu6sv

pvabu6sv2#

csv.reader允许您指定分隔符。在您的情况下,这将只是一个空格。
所以你的代码的第19行应该是:lines = csv.reader(csvfile, delimiter=' ')
更多详情请看这里:https://docs.python.org/3/library/csv.html#csv.reader

soat7uwm

soat7uwm3#

您的代码将delimiter=' '添加到csv.reader行,并使用该数据不会产生所声称的错误。然而,仍然存在错误的是,数据应转换为float,并且x和y限制设置不正确,无法查看提供的数据。我只是将它们注解掉。下面使用所示的示例数据:

import matplotlib.pyplot as plt
import csv

plt.grid(which='major')   
#plt.xlim(140,300)
#plt.ylim(0,90)
plt.ylabel(r'Altitude [km]')
plt.xlabel('Temperature [K]')

ALT = []
T = []

with open('atmoprofile.csv','r') as csvfile:
    lines = csv.reader(csvfile, delimiter=' ')
    for col in lines:
        T.append(float(col[0]))    # convert to float
        ALT.append(float(col[2]))

print(ALT)
print(T)

plt.plot(T,ALT, color = 'm', marker = '.')
plt.show()
#plt.savefig('FIG3.1.png',dpi=300)

输出:

x3naxklr

x3naxklr4#

这里的主要问题是csv.reader返回一个字符串列表:
csv.readercsvfile, dialect='excel', **fmtparams):

**从csv文件读取的每一行都以字符串列表的形式返回。**除非指定QUOTE_NONUMERIC格式选项,否则不会执行自动数据类型转换(在这种情况下,未加引号的字段将转换为浮点数)。

  • 来源 *:[python.docs]

对于float类型转换,我会这样做:

import csv
import matplotlib.pyplot as plt

plt.grid(which='major')   
plt.ylabel(r'Altitude [km]')
plt.xlabel('Temperature [K]')

with open('atmoprofile.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=' ')
    T, ALT = zip(*[(float(row[0]), float(row[2])) for row in reader])

plt.plot(T, ALT, color='m', marker='.')
# plt.savefig('FIG3.1.png', dpi=300) # uncomment this line to make a fig/png
plt.show();

输出:

相关问题