2015-02-04 1 views
0

일부 데이터에서 플롯을 만들려고하는데 데이터에 2 개의 컬럼이 있어도 인덱스 범위를 벗어납니다. 여기 코드는 다음과 같습니다파이썬으로 CSV 데이터를 플로팅 :리스트 인덱스가 범위를 벗어났습니다.

여기

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
def getColumn(filename, column): 
    results = csv.reader(open(filename), delimiter='\t') 
    return [result[column] for result in results] 

그것은 기다려온로하지 results의 모든 요소는 항상 두 요소를 포함하는 것이 가능하다에게 있습니다. 예를 들어, csv 파일에 빈 행이 있습니다.

변경에 getColumn 메소드의 마지막 라인 : 라인의 일부가 충분히 필드를 포함하지 않는 경우가 column 낮은 더 오래 목록을 반환 할 수 있기 때문에, 그러나 위험

return [result[column] for result in results if len(result) > 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에 대해 동일한 길이를 보장합니다.

+0

그러나 파일에 빈 줄이 포함되어 있지 않으며 추가 할 때 x와 y의 치수가 같아야합니다 (?) – Steven

+1

@StevendeRond - 파일에 다음과 같은 행이 있습니다. 단일 요소. 업데이트 된 답변을 확인하십시오. – eumiro

+0

이것을 사용하면 파장과 플럭스가 모두 비어 있습니다. 파일에는 두 번째 열에 0이 있고 나머지는 매우 작은 숫자이므로 maby가 문제입니까? – Steven

관련 문제