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

Python 为每个文件块运行不同的代码,python,Python,我有一个数值计算的输出文件。输出文件如下所示 aa ab ac ad ae┐ ba bb bc bd be┘ 由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浮点数块

我有一个数值计算的输出文件。输出文件如下所示

aa ab ac ad ae┐
ba bb bc bd be┘ 由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()
file=open(“myfile”、“r”)
对于i,枚举(文件)中的行:

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

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"

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

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"

以下是另一种方法:

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'

以下是另一种方法:

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'
输出:

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']
----------
输出:

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']
----------

假设您的模式仅基于浮点和字符串。从第一行开始,对它们进行计数,直到下一行也有相同的计数,否则继续下一个代码块。这有帮助吗?这三种类型的块总是分别以2、3和6行的形式出现,还是这仅仅是一个例子?@timgeb行不同。一些文件有2,3,6行,而其他文件有2,5,16行,等等。啊,但是你不能在类型3的块之后有类型1的块,对吗?@timgeb是的。块的顺序总是相同的,因为您的模式仅基于浮点和字符串。从第一行开始,对它们进行计数,直到下一行也有相同的计数,否则继续下一个代码块。这有帮助吗?这三种类型的块总是分别以2、3和6行的形式出现,还是这仅仅是一个例子?@timgeb行不同。一些文件有2,3,6行,而其他文件有2,5,16行,等等。啊,但是你不能在类型3的块之后有类型1的块,对吗?@timgeb是的。块的顺序总是相同的