用Python将数据文件列分割成单独的数组

3

我是 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

但显然它完全是错误的。有人能给我一个简单的答案,并解释一下这些行到底是什么意思吗?谢谢。
编辑:前两行在整个文件中都重复出现。
4个回答

5
这需要使用 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)

或者如果你真的需要之后能够改变数据,你可以只需在每个元组上调用list构造函数:

Xvals, Yvals = [list(block) for block in zip(*lines)]

展开运算符不是zip函数的一部分...否则,解决方案不错。 - Niklas B.
1
这行代码不能工作:.split() 是一个字符串方法,而lines是一个字符串列表。你需要使用 Xvals, Yvals = zip(*(line.split() for line in lines)) 或者其他方法来解决。 - DSM
我遇到一个与"Xvals, Yvals = zip(*(lines.split())"行有关的无效语法错误。如果有改变我正在使用Python 3.2。 - T May

2
一种方法是:
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函数,它将把文件中获取的字符串转换为数字。


我在第一行(Xvals = [],Yvals = [])遇到了一个“ValueError:需要多于0个值来解包”的错误。 - T May
抱歉:第一行应该是 Xvals=[]; Yvals=[](或者两行分别写)。 - David Robinson
另一个错误“ValueError:需要多个值来解包”...也许我做错了什么? - T May

1

这就是 numpy.loadtxt 设计的目的。请尝试:

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

抱歉,我编辑了我的问题,时间步信息也会在文件的后面出现,因此当它遇到它时,它将抛出浮点转字符串转换错误,因此这个程序无法运行。 - T May

0
如果您想使用matplotlib绘制此文件,您可能需要查看它的plotfile函数。请参阅官方文档here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接