2012-07-23 48 views
0

我尝试使用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 

任何帮助不胜感激;谢谢!

+0

究竟是你想要的输出格式?你想要A,B和C的二维列表?你需要创建这些文件(a.txt,b.txt等),还是只是为了存储数据而创建它们? – 2012-07-23 18:12:47

+0

是的,我正在寻找A,B和C的二维列表。例如,对于B,我会让每个事件对应一行,然后列将是b_0,b_1,b_2和B_3。至少,我正试图用b_points来做这件事。我正在创建.txt文件,因为我以前使用过loadtxt,它似乎按照我的意愿来做。如果有更简单的方法来创建格式良好的输出,我很乐意尝试! – user1507006 2012-07-24 11:31:24

+0

对不起,更具体地说,我希望能够说b [4] [2],并从第四场比赛获得b_2数据。 – user1507006 2012-07-24 11:45:33

回答

0

当vals = []时,IndexError来自尝试访问vals [0]。如果你扩大你的代码中的错误可能会更有意义:

vals = [] 
for i in usecols: 
    vals[i] = i 

错误发生在第一次使用的循环,因为瓦尔斯[0]是不是在列表中。我会提出一个解决方案,但我不确定你想要做什么。如果你只是想丘壑是列表[0,1,2,3,4]你可以只使用

vals = range(5) 

编辑: 在一个侧面说明,我不认为它保存在一个单独的文件是必要的。这将是好了很多,只是它直接保存到阵列中,如:

M = 10000  # number of events 
file = open('data.txt') 
a = [] 
b = [] 
c2 = [] 
c2 = [] 

def parseLine(line, section): 
    line = line.split() 
    line = line[1:] # To take out the letter at the start 
    section.append(line) 

file.next() 
for i in range(M): 
    parseLine(file.next(), a) 
    parseLine(file.next(), b) 
    nextLine = file.next() 
    if nextLine.startswith("C"): 
     parseLine(nextLine, c1) 
     nextLine = file.next() 
     if nextLine.startswith("C"): 
      parseLine(nextLine, c2) 
      file.next() # To get to the end of the event 
     else: 
      c2.append([0]) 
    else: 
     c1.append([0]) 
     c2.append([0]) 
    file.next() 

不过要小心,因为从8日的事件得到第二个元素的元素对于B,你会做B [7] [ 1],所以它是[事件-1] [第1列]

+0

对不起,我不确定我是否理解 - 所以我应该定义'vals = range(5)',然后设置'usecols = vals'? – user1507006 2012-07-24 12:17:42

+0

我想我在发生问题时会误解。在调用loadtxt()行时是否发生错误?我以为你实际上是在调用vals = [vals [i] for usecols]。如果是这种情况,我不知道为什么indexError发生,除非你调用它的c数据,其中一些行不会有5列,因此你会得到一个索引超出范围错误。无论哪种方式,我不知道你为什么使用unpack = True,如果你不这样做,那么之后就不需要重新构造数据。 – 2012-07-24 19:49:16