2017-04-03 94 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'] 
---------- 
相關問題