2017-04-03 95 views
0

我有一些来自某些数值计算的输出文件。输出文件看起来像为每个文件块运行不同的代码

AA AB AC广告AE┐
BA BB BC BD是┘5串
0.5 1.2 0.3 AAA BBB┐
0.2 8.2 3.3 CCC DDD┃3浮子+的块的块2串
0.5 1.3 0.6 EEE GGG┘
0.11 0.444 0.333 0.777 0.88┐
0.41 0.544 0.313 0.797 0.01┃
0.11 0.447 0.333 0.777 0.88 6┃浮子座
0.17 0.444 0.333 0.787 0.03┃
0.11 0.444 0.333 0.777 0.88┘

,这意味着,它形成一些图案的块。我想要做的是阅读这个文件,并分别为每个块做一些东西。

对于最简单的方法,我写的代码像

file = open("myfile", "r") 
for i, line in enumerate(file): 
    if i <= 1: 
     # do some stuff 1. 
    elif 1< i <=4 : 
     # do some stuff 2 
    elif 4 < i : 
     # do some stuff 3 
file.close() 

和手工指定的行号,每当我运行程序。问题是输出文件的行号因文件而异(但模式相同),并且在我通过眼睛手动检查之前,我不知道每个块会有多长。处理这个问题的有效方法是什么?

每个文件的大小约为100〜1000MB,每个文件大小约为500000〜5000000行。

+1

说你的模式是仅基于float和字符串。从第一行开始,保持它们两个的计数并且直到下一行也具有相同的计数,否则继续到代码的下一个块。这有帮助吗? – alDiablo

+0

这三种类型的块*总是分别是2,3和6行还是仅仅是一个例子? – timgeb

+0

@timgeb该行不同。某些文件有2,3,6行,而其他文件有2,5,16行等等。 – user42298

回答

2

您可以使用正则表达式来检查每行匹配的模式,然后为每行执行相应的代码块。

import re 

for x in lines: 
    ## matches any number of floats 
    if re.match("^([0-9\.]+\s?)+$", x): 
     print "do stuff 3" 

    ## matches 3 floats and 2 strings 
    elif re.match("^([0-9\.]+\s?){3}(\w+\s?){2}$", x): 
     print "do stuff 2" 

    ## matches 5 strings 
    elif re.match("^(\w+\s?){5}$", x): 
     print "do stuff 1" 
0

这里是另一种方法:

a = '''aa ab ac ad ae 
ba bb bc bd be 
0.5 1.2 0.3 aaa bbb 
0.2 8.2 3.3 ccc ddd 
0.5 1.3 0.6 eee ggg 
0.11 0.444 0.333 0.777 0.88 
0.41 0.544 0.313 0.797 0.01 
0.11 0.447 0.333 0.777 0.88 
0.17 0.444 0.333 0.787 0.03 
0.11 0.444 0.333 0.777 0.88''' 

for line in a.split('\n'): 
    if line[0].isalpha(): 
     print 'Group1' 
    elif line[0].isdigit() and line[-1].isalpha(): 
     print 'Group2' 
    elif line[0].isdigit() and line[-1].isdigit(): 
     print 'Group3' 
0
# -*- coding: utf-8 -*- 
f = open("demo.txt","r") 
data = f.readlines() 
start = "┐" 
end = "┘" 
demo_temp_list =[] 
final_list = [] 
for d in data: 
    if start in d: 
     demo_temp_list = [] 
     demo_temp_list.append(d) 
    elif end in d: 
     demo_temp_list.append(d) 
     final_list.append(demo_temp_list) 
    else: 
     demo_temp_list.append(d) 

for index,final_data in enumerate(final_list): 
    print "Group ", index+1 
    print final_data 
    print "----------" 

输出:

Group 1 
['aa ab ac ad ae \xe2\x94\x90\n', 'ba bb bc bd be \xe2\x94\x98 Block of 5 strings\n'] 
---------- 
Group 2 
['0.5 1.2 0.3 aaa bbb \xe2\x94\x90\n', '0.2 8.2 3.3 ccc ddd \xe2\x94\x83 Block of 3 float + 2 string\n', '0.5 1.3 0.6 eee ggg \xe2\x94\x98\n'] 
---------- 
Group 3 
['0.11 0.444 0.333 0.777 0.88 \xe2\x94\x90\n', '0.41 0.544 0.313 0.797 0.01 \xe2\x94\x83\n', '0.11 0.447 0.333 0.777 0.88 \xe2\x94\x83 Block of 6 float\n', '0.17 0.444 0.333 0.787 0.03 \xe2\x94\x83\n', '0.11 0.444 0.333 0.777 0.88 \xe2\x94\x98'] 
---------- 
相关问题