2012-07-23 46 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