使用matplotlib从文本文件中读取三列

时间:2015-01-23 20:35:39

标签: matplotlib

我的输入文件(text.txt)包含三列。第一列属于x轴,第二列属于y轴,第三列再次代表y轴。当我运行我的代码时,我得到“x.append(float(line.split()[0]))IndexError:列表索引超出范围”。我该如何解决这个错误?

我的代码:

#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt

with open("text.txt", "r") as data_file:
lines=data_file.readlines()
x=[]
y1=[]
y2=[]
counter=0
 for line in lines:
 if((line[0]!='#') and (line[0]!='@')):
 x.append(float(line.split()[0]))
 y1.append(float(line.split()[0]))
 y2.append(float(line.split()[1]))
 counter+=1
plt.plot(x, y1, y2)
plt.savefig("text.png", dpi=300)

my text.txt:input

# Carbon
# Gallium 
#
@ title 
@ xaxis  
1.00    2.12    14.51   
2.00    4.54    18.14
3.00    6.12    45.11
4.00    9.02    89.15
5.00    6.48    49.99
6.00    8.01    92.33
7.00    7.56    95.14
8.00    5.89    96.01

1 个答案:

答案 0 :(得分:0)

您收到错误

IndexError: list index out of range

因为您的数据文件包含空行。它们可能位于文件的末尾。

您可以通过添加

来修复它
for line in lines:
    if not line.strip(): continue

但是我会使用NumPy's genfromtxt来解析文件,而不是您发布的代码:

import numpy as np
import matplotlib.pyplot as plt

with open("text.txt", "r") as f:
    lines = (line for line in f if not any(line.startswith(c) for c in '@#'))
    x, y1, y2 = np.genfromtxt(lines, dtype=None, unpack=True)

plt.plot(x, y1, x, y2)
plt.savefig("text2.png", dpi=300)

如果您想用最少的更改来修复原始代码,它可能看起来像这样:

with open("text.txt", "r") as f:
    x = []
    y1 = []
    y2 = []
    for line in f:
        if not line.strip() or line.startswith('@') or line.startswith('#'): 
            continue
        row = line.split()
        x.append(float(row[0]))
        y1.append(float(row[1]))
        y2.append(float(row[2]))

    plt.plot(x, y1, x, y2)
    plt.savefig("text.png", dpi=300)

提示:readlines() 读取整个文件并返回字符串列表。这可能需要很多 内存,如果文件很大。因此,除非您确实需要将整个文件转换为字符串列表,否则永远不要使用lines=data_file.readlines()。否则,如果您可以使用

一次一个地处理每一行,则需要更少的内存
for line in f: