【问题标题】:Plotting CSV data with python: List index out of range用python绘制CSV数据:列表索引超出范围
【发布时间】:2015-02-04 15:29:38
【问题描述】:

我正在尝试从一些数据中绘制图表,但即使数据有 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

【问题讨论】:

    标签: python file csv indexing plot


    【解决方案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 的长度相同。

    【讨论】:

    • 但是文件不包含任何空行,当我添加这个时,我得到一个值错误,x 和 y 必须具有相同的维度(?)
    • @StevendeRond - 然后文件有一些带有单个元素的行。检查我更新的答案。
    • 如果我使用它,波长和通量都是空的。该文件在第二列中确实有零,其余的都是非常小的数字,所以这可能是问题所在?
    • 空了?您可以添加几个prints 来查看代码的作用。哦,我们(我们俩)忘记将字符串转换为浮点数。现在已经更新了。
    • print rowforif 行之间打印什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多