我试图从某些数据创建一个图,但即使数据有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
答案 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]))
这保证wavelength
和flux
的长度相同。