2012-02-03 121 views
1

我有一個非常複雜的解析問題。任何想法,將在這裏讚賞。我必須解析的TEST.DAT文件。該文件看起來像這樣:複雜的解析查詢

* Number     =    40 

Time = 0 
    1 10.13 10 10.11 12 13 
    . 
    . 

Time = n 
    1 10 10 10 12.50 13 
    . 
    . 

有N個時間塊和每塊具有40行如上所示。我想要做的是添加例如第一個塊的第一行,然後是塊#2中的第一行......以此類推以創建一個新文件-test_1.dat。同樣,每個塊的第二行到test_2.dat等等。塊中的行應寫入,如到新的_n.dat文件。有沒有辦法做到這一點?我在這裏假設的數字是40,所以如果*數字= 40,則每個時間塊下將有40行。

問候, R2爲

+0

這看起來像一個家庭作業問題。如果不是,請添加一些關於你想要完成的事情的信息。 – gfortune 2012-02-03 07:08:37

+0

其實我已經生成了一個文件test.dat(output),並且正在提取時間塊的片段,以幫助查看我的輸出結果。我可以在測試中解析大部分其他的東西,dat。只是這個特別的問題在困擾着我。 – user741592 2012-02-03 07:10:57

回答

0

您可以爲字符串(稱之爲的fileList),其中每個字符串是不同的線路列表讀取文件:

f = open('filename') 
fileList = f.readlines() 

然後,去掉「頭「與

fileList.pop(0) 
fileList.pop(0) 

那麼你的文件的一部分,做

outFileContents = {} # This will be a dict, where number -> content of test_number.dat 
for outFileName in range(1,41): #outFileName will be the number going after the _ in your filename 
    outFileContents[outFileName] = [] 
    for n in range(40): # Counting through the time blocks 
     currentRowIndex = (42 * n) + outFileName # 42 to account for the Time = and blank row 
     outFileContents[outFileName].append(fileList[currentRowIndex]) 

最後,您可以遍歷outFileContents並寫入每個值的內容以分隔文件。

+0

如果你想讓它更加靈活,你可以從第一行讀取數字(稱爲'num')。然後將'range(1,41)'改爲'range(1,num + 1)',將'range(40)'改爲'range(num)',並將'42'改爲'(2 + num) 。 – austin1howard 2012-02-03 07:32:41

+0

嗨,謝謝,這看起來不錯。只是一個簡短的問題,請你解釋outFileContents = {}。我應該找到一個以Time開頭的塊,找到這條線並從這裏索引其他行嗎? – user741592 2012-02-03 08:37:41

+0

'outFileContents = {}'只是將'outFileContents'變量初始化爲一個空字典。通過從列表中彈出兩個條目,你基本上使得時間= 0你的第0行。所以其他一切都可以從那裏參考。 – austin1howard 2012-02-03 10:06:37