使用python绘制CSV数据:列表索引超出范围

时间:2015-02-04 15:29:38

标签: python file csv indexing plot

我试图从某些数据创建一个图,但即使数据有2列,我也会得到索引超出范围错误。这是代码:



import csv
from matplotlib import pyplot as plt


def getColumn(filename, column):
    results = csv.reader(open(filename), delimiter='\t')
    return [result[column] for result in results]

wavelength = getColumn('Bb69.dat.fix',0)
flux = getColumn('Bb69.dat.fix',1)

plt.figure('Bb69')
plt.xlabel('Wavelength (angstrom)')
plt.ylabel('flux (erg/cm^2/s/angstrom)')
plt.plot(wavelength,flux)
plt.show()




这是错误

Traceback (most recent call last):

  File "SP12.py", line 14, in <module>

    flux = getColumn('Bb69.dat.fix',1)

  File "SP12.py", line 11, in getColumn

    return [result[column] for result in results]

IndexError: list index out of range

1 个答案:

答案 0 :(得分:1)

def getColumn(filename, column):
    results = csv.reader(open(filename), delimiter='\t')
    return [result[column] for result in results]

有可能,并非results的所有元素都包含等待的2个元素。例如,csv文件包含空行。

getColumn方法的最后一行更改为:

    return [result[column] for result in results if len(result) > column]

但这是一种风险,因为如果某些行不包含足够的字段,它可能会返回较低的column列表。

更好的是:

wavelength = []
flux = []

with open('Bb69.dat.fix') as f:
    for row in csv.reader(f, delimiter='\t'):
        if len(row) >= 2:
            wavelength.append(float(row[0]))
            flux.append(float(row[1]))

这保证wavelengthflux的长度相同。