Как получить строки между двумя повторяющимися образцами в большом файле с помощью Python - PullRequest
0 голосов
/ 19 июня 2019

Я пытался извлечь из txt файла постоянные шаблоны "beginPattern" и "endPattern", между которыми только значения ключа в строке1 и строке2 являются индексом, тогда значения для извлеченного gettting можно найти в любой строке (key = value;)

[BEGIN_PATTERN]
    line1=abd;
    line2=ZXY;
    ...
    line43=454; 
    ...
    ...
[END_PATTERN]
[BEGIN_PATTERN]
    line1=abc;
    line2=ZXC;
    ...
    line72=847;
    ...
[END_PATTERN]
[BEGIN_PATTERN]
    line1=abe;
    line2=ZXV;
    ...
    line33=135;
    ...
[END_PATTERN]
[BEGIN_PATTERN]
    line1=abt;
    line2=ZXF;
    ...
    line54=734;
    ...
[END_PATTERN]

ожидаемый результат:

abd,ZXY,aaa,454,ggg,ggs
abc,ZXC,mgf,847,jde,g3e
abe,ZXV,ytd,135,dfs,jhf
abt,ZXF,ytf,734,ytd,hge

Я пытался с помощью скрипта Python и re.match, он только читает и записывает в выходной файл значение abd,ZXY в первый beginPattern и endPattern найден

import re

START_PATTERN = '<BEGIN'
END_PATTERN = '<BEND'

with open('DB_example.txt') as file:
    match = False
    newfile = None

    for line in file:
        if re.match(START_PATTERN, line):
            match = True
            newfile = open('my_new_file.txt', 'w')
            continue
        elif re.match(END_PATTERN, line):
            match = False
            newfile.close()
            continue
        elif match:
            #remove TAB and BreakLine
            valor=line.rstrip().replace('\t','')
            #split Key and value
            (key, val) = valor.split('=')
            if re.match('line1',key):
                match = True
                #before write into file remove ";"
                newfile.write(val.replace(';',''))
                continue
            elif re.match('line2',key):
                match:False
                newfile.write(','+val.replace(';', ''))
                continue
            elif re.match('lineXX',key):
                match:False
                newfile.write(','+val.replace(';', ''))
                continue
            elif re.match('lineYY',key):
                match:False
                newfile.write(','+val.replace(';', ''))
                continue

не продолжается со вторым, третьим и последующими паттернами. мои файлы имеют по крайней мере 300 000 совпадений. Я ценю вашу помощь.

1 Ответ

1 голос
/ 19 июня 2019

Каждый раз, когда вы открываете файл и после записи вы закрываете файл. Поэтому после открытия файла каждый раз newfile.write просто перезаписывает предыдущий.

Если вы хотите добавить новое значение val в файл, попробуйте открыть файл только один раз, прежде чем что-либо записывать, и после записи всех значений вы должны закрыть файл.

import re

START_PATTERN = '<BEGIN'
END_PATTERN = '<BEND'
newfile = open('my_new_file.txt', 'w')
with open('DB_example.txt') as file:
    match = False
    for line in file:
        if re.match(START_PATTERN, line):
            match = True
            continue
        elif re.match(END_PATTERN, line):
            match = False
            continue
        elif match:
            #remove TAB and BreakLine
            valor=line.rstrip().replace('\t','')
            #split Key and value
            (key, val) = valor.split('=')
            if re.match('line1',key):
                match = True
                #before write into file remove ";"
                newfile.write(val.replace(';',''))
                continue
            elif re.match('line2',key):
                match:False
                newfile.write(','+val.replace(';', ''))
                continue
            elif re.match('lineXX',key):
                match:False
                newfile.write(','+val.replace(';', ''))
                continue
            elif re.match('lineYY',key):
                match:False
                newfile.write(','+val.replace(';', ''))
                continue

newfile.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...