Как с помощью Python вытащить из файла числа, которые находятся перед и после определенного текста

Рейтинг: -1Ответов: 1Опубликовано: 22.02.2023

Есть файл (10 мб), из которого нужно вытащить числа, которые идут перед и после определенного текста, затем эти числа скопировать в третий файл. Число, которое находится перед текстом, назвать в третьем файле name1, число которое находится после текста, назвать name2.

Вот пример из файла:

    <record>
        <integer id="database_table_type" value="1"/>
        <large id="db_unique_id" value="77541356759907188"/>
        <integer id="version" value="57854321"/>
        <unsigned id="property" value="1348695145"/>
        <record id="new_value">
            <unsigned id="id" value="1853322860"/>
            <integer id="Ttea" value="602"/>
        </record>
        <record id="odvl">
            <unsigned id="id" value="1868854892"/>
            <integer id="Ttea" value="618"/>
        </record>
    </record>
    <record>

Нужно сделать поиск по такому такому тексту:

                                                 "/>
        <integer id="version" value="57854321"/>
        <unsigned id="property" value="1348695145"/>
        <record id="new_value">
            <unsigned id="id" value="1853322860"/>
            <integer id="Ttea" value="

и вытащить числа которые в начале и конце от этого текста.

В данном примере:

77541356759907188 - это число перед текстом.

602 - это число после текста.

Нужно записать их в новый файл так:

name1: 77541356759907188

name2: 602

Почему надо совершать поиск именно так, а не например просто по "db_unique_id" и "Ttea", потому что тогда охватятся ненужные числа, потому что если в "property" value="1348695145" и "id" value="1853322860" будут другие значения,то рядом стоящие числа не нужны.


Понимаю, что выгдядит всё это непонятно. Попробую на другом примере объяснить.

Представьте, что есть файл, в котором очень много таких вариантов строк:

"число"первыйвариант"число"

"число"второйвариант"число"

"число"третийвариант"число"

"число"первыйвариант"число"

и тд.

Нужны те числа, которые располагаются в кавычках перед и после "первыйвариант".

Например:

"111"первыйвариант"222"

"333"второйвариант"444"

"555"третий вариант"666"

"777"первыйвариант"888"

Результат:

name1: 111

name2: 222

name1: 777

name2: 888

Ответы

▲ 1Принят

Предварительно нужно установить библиотеку lxml, типа pip install lxml Важно чтобы входной файл был "исправен", т.е. теги закрыты. Слишком маленький кусок файла, чтобы понять структуру.

from lxml import etree

with open('fm.xml') as f:
    s = f.read()

root = etree.XML(s)
res = ''
for el in root.xpath('//record/unsigned [@id="property"]'):
    if el.get('value') == '1348695145':                             #Выбираем "property" value="1348695145"
        t = el.find('..//large')
        z1 = t.values()[1]

        for t1 in el.xpath('..//record [@id="new_value"]'):
            if len(t1):
                if t1[0].get('value') == '1853322860':              #Выбираем  "id" value="1853322860"
                    z2 = t1[1].get('value')
                    res += f'name1:{z1} \nname2:{z2} \n'

with open('out.txt', 'w') as of:
    of.write(res)