我尝试使用Python从中此格式的文本文件解析数据:解析数据由事件在Python
<event>
A 0.8
B 0.4 0.3 -0.5 0.3
</event>
<event>
A 0.2
B 0.3 0.2 -0.5 0.8
C 0.1 0.3 -0.3 0.2
C -0.2 0.4 -0.1 0.9
</event>
<event>
A 0.4
B 0.4 0.3 -0.5 0.3
C 0.3 0.7 0.6 0.5
</event>
变量一个& B是总是出现在每一个事件,但你可以看到,C变量在一次事件中最多可能发生两次,有时完全不会发生。总共有大约10,000多个活动。
我想格式化所有这些,这样我就可以单独调用每一条数据(即第2列中的变量B来自事件3),也可以分组(即绘制变量A,第0列为所有事件),但重复的C变量让我有点绊倒。理想情况下,我希望为C变量#1和C变量#2提供一列数据,其中当事件中只有一个或零个C变量时,数据可以简单地为0。
我的代码目前还不够完美,输出格式也不完全符合要求,所以我很乐意提供关于如何简化和改进的建议。
M = 10000 # number of events
file = open('data.txt')
a_lines = open('a.txt','w')
b_lines = open('b.txt','w')
c1_lines = open('c1.txt','w')
c2_lines = open('c2.txt','w')
c1 = []
c2 = []
for i in range(M):
for line in file:
if not line.strip():
continue
if line.startswith("</event>"):
break
elif line.startswith("<event>"):
a = file.next()
print >>a_lines,i,a
for i in range(M):
for line in file:
if line.startswith("B"):
print >>b_lines,i,line.strip()
nextline=file.next().strip()
c1.append(nextline)
nextline2=file.next().strip()
c2.append(nextline2)
break
# Parsing the duplicate C columns...
# I've formatted it so the 0 is aligned with the other data
for i in range(M):
if "C" in c1[i]:
print >>c1_lines, i, c1[i]
else:
print >>c1_lines, i, "C 0"
for i in range(M):
if "C" in c2[i]:
print >>c2_lines, i, c2[i]
else:
print >>c2_lines, i, "C 0"
# Sample variable formatting attempt:
b_event_num,b_0,b_1,b_2,b_3=loadtxt("b.txt",usecols=(0,1,2,3,4),unpack=True)
b_0=array(b_0)
b_1=array(b_1)
b_2=array(b_2)
b_3=array(b_3)
b_0=b_0.reshape((len(b_0)),1)
b_1=b_1.reshape((len(b_1)),1)
b_2=b_2.reshape((len(b_2)),1)
b_3=b_3.reshape((len(b_3)),1)
b_points=np.hstack((b_0,b_1,b_2,b_3))
提取的数据本身看起来不错,但是当我尝试在列装载,我得到了下面的错误,我不知道为什么:
vals = [vals[i] for i in usecols]
IndexError: list index out of range
任何帮助不胜感激;谢谢!
究竟是你想要的输出格式?你想要A,B和C的二维列表?你需要创建这些文件(a.txt,b.txt等),还是只是为了存储数据而创建它们? – 2012-07-23 18:12:47
是的,我正在寻找A,B和C的二维列表。例如,对于B,我会让每个事件对应一行,然后列将是b_0,b_1,b_2和B_3。至少,我正试图用b_points来做这件事。我正在创建.txt文件,因为我以前使用过loadtxt,它似乎按照我的意愿来做。如果有更简单的方法来创建格式良好的输出,我很乐意尝试! – user1507006 2012-07-24 11:31:24
对不起,更具体地说,我希望能够说b [4] [2],并从第四场比赛获得b_2数据。 – user1507006 2012-07-24 11:45:33