我嘗試使用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