2012-02-03 72 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