在Python中将数据文件列拆分为单独的数组
我是python新手,一整天都在努力解决这个问题。我有一个如下所示的数据文件在Python中将数据文件列拆分为单独的数组,python,Python,我是python新手,一整天都在努力解决这个问题。我有一个如下所示的数据文件 time I(R_stkb) Step Information: Temp=0 (Run: 1/11) 0.000000000000000e+000 0.000000e+000 9.999999960041972e-012 8.924141e-012 1.999999992008394e-011 9.623148e-012 3.999999984016789e-011 6.154220e-01
time I(R_stkb)
Step Information: Temp=0 (Run: 1/11)
0.000000000000000e+000 0.000000e+000
9.999999960041972e-012 8.924141e-012
1.999999992008394e-011 9.623148e-012
3.999999984016789e-011 6.154220e-012
(注意:每个数据行之间没有空行。)
我想使用matplotlib函数来绘制数据,因此我需要数组中的两个独立列
我现在有
def plotdata():
Xvals=[], Yvals=[]
i = open(file,'r')
for line in i:
Xvals,Yvals = line.split(' ', 1)
print Xvals,Yvals
但显然这是完全错误的。有谁能给我一个简单的答案,并解释一下这些行的确切意思会很有帮助。干杯
编辑:前两行在整个文件中重复。一种方法是:
Xvals=[]; Yvals=[]
i = open(file,'r')
for line in i:
x, y = line.split(' ', 1)
Xvals.append(float(x))
Yvals.append(float(y))
print Xvals,Yvals
请注意对
float
函数的调用,该函数将把从文件中获取的字符串更改为一个数字。这是*
操作符在zip
方法上的一项工作
>>> asdf
[[1, 2], [3, 4], [5, 6]]
>>> zip(*asdf)
[(1, 3, 5), (2, 4, 6)]
因此,在您的数据上下文中,它可能类似于:
handle = open(file,'r')
lines = [line.split() for line in handle if line[:4] not in ('time', 'Step')]
Xvals, Yvals = zip(*lines)
或者,如果您真的需要能够在以后对数据进行变异,您可以在每个元组上调用列表构造函数:
Xvals, Yvals = [list(block) for block in zip(*lines)]
这就是设计的目的。尝试:
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt(file, skiprows = 2) # assuming you have time and step information on 2 separate lines
# and you do not want to read them
plt.plot(data[:,0], data[:,1])
plt.show()
编辑:
如果文件中分散了时间和步长信息,并且希望在每个步长上绘制数据,则可以将所有文件读取到内存中(假设文件足够小),然后在time
字符串上拆分:
l = open(fname, 'rb').read()
for chunk in l.split('time'):
data = np.array([s.split() for s in chunk.split('\n')[2:]][:-1], dtype = np.float)
plt.plot(data[:,0], data[:,1])
plt.show()
或者,您可以将#
注释符号添加到注释行,并使用np.loadxt
如果要使用matplotlib打印此文件,您可能需要检查其plotfile功能。请参阅官方文档。第一行(xVAL=[],Yvals=[])出现错误“ValueError:需要超过0个值才能解包”(xVAL=[])抱歉:第一行应该是xVAL=[];Yvals=[]
(或两行单独的代码)另一个错误“ValueError:需要超过1个值才能解包”…可能我做错了什么?splat运算符不是zip
函数的一部分。。。否则,这是一个不错的解决方案。这不起作用:.split()
是一个字符串方法,而line是一个字符串列表。您需要Xvals,Yvals=zip(*(lines.split()表示行中的行))
或其他什么。我得到一个与“Xvals,Yvals=zip(*(lines.split())有关的invaild语法错误行。如果有任何变化,我将使用python 3.2。抱歉,我编辑了我的问题,时间步长信息也会在文件的后面出现,因此当遇到它时,它会抛出一个浮点到字符串的转换错误,因此不会运行。