在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

我是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-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。抱歉,我编辑了我的问题,时间步长信息也会在文件的后面出现,因此当遇到它时,它会抛出一个浮点到字符串的转换错误,因此不会运行。