为每个文件块运行不同的代码

时间:2017-04-03 10:43:29

标签: python

我有一些数值计算的输出文件。输出文件看起来像

  

aa ab ac ad ae┐
  ba bb bc bd┘块5弦   0.5 1.2 0.3 aaa bbb┐
  0.2 8.2 3.3 cccddd┃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.7770.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行。

3 个答案:

答案 0 :(得分: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"

答案 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'

答案 2 :(得分: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']
----------