我是OSX上的Python新手,需要在.txt文件中绘制两列数据。在Windows上我使用'x [:,0]'函数来表示列,虽然这似乎在Mac上不起作用。我尝试过以下方法:
f = open(os.path.expanduser("~/Desktop/a.txt.rtf"))
lines=f.readlines()
result=[]
for x in lines:
result.append(x.split(' ')[0])
for y in lines:
result.append(y.split(' ')[1])
f.close()
plt.plot(x,y)
plt.show()
但它表示列表索引超出范围,即使测试文件只是:
1 2
3 4
5 6
7 8
怎么会这样?请帮忙!
解决这个问题后,我需要知道Mac替代“skip_header =”函数(因为我想要使用的文件有我需要的数据,从25行开始......)
提前致谢,对不起,如果这些是简单的查询,但我无法让它发挥作用:(
答案 0 :(得分:3)
这根本不是一个简单的问题。这是一个非常好的问题,许多人在日常工作中面临同样的问题。你的问题也会帮助别人!
错误是因为您正在尝试阅读所谓的Rich Text Format file (RTF)。因此,文件的真实内容与您在屏幕上看到的不同,而是编码字符串。
而不是
['1 2', '3 4',...]
f.readline()实际上生成类似
的内容['{\\rtf1\\adeflang1025\\ansi\\ansicpg1252\\uc1\\adeff31507\\deff0\\stshfdbch31505\\stshfloch31506\\stshfhich31506\\stshfbi31507\\...]
因此,当您尝试索引拆分行时,会导致索引超出范围错误。
解决这个问题的3个想法。首先,您可以考虑将RTF转换为纯文本,并使用readline()读取文本文件。或者,您可以使用某些第三方解析器阅读RTF。或者,您可以使用正则表达式自己解析RTF。这是一些有用的链接希望它有所帮助。
<强>更新强>
虽然目前还不是很清楚你想要绘制的内容,但我猜你真正想要的是关于数据文件中第1和第2列的散点图。如果是这样,您可能需要修改一下代码。以下是一个例子。
假设您的a.txt文件(不是rtf)包含内容
1 2
3 4
5 6
7 8
您可以这样绘制x y散点图,第1列为x第2列为y。
import matplotlib.pyplot as plt
f = open(os.path.expanduser("a.txt"))
lines = f.readlines()
x, y = [], []
for line in lines:
x.append(line.split()[0])
y.append(line.split()[1])
f.close()
print(x, y)
plt.plot(x,y)
plt.show()
或使用单行
f = open(os.path.expanduser("a.txt"))
lines = f.readlines()
x, y = zip(*(line.split() for line in lines))
f.close()
print(x, y)
plt.plot(x,y)
plt.show()