Текст в файле заменен на регулярное выражение.Как записать изменения в файл? - PullRequest
0 голосов
/ 23 января 2019

Я могу построчно изменять текст в файле, но я не знаю, как записать результаты (изменения) в файл.

Это небольшая часть моего файла:

<name>2016-09-15_obere-firstalm_gehen-6,5km</name>
<extensions>
    <line xmlns="http://www.topografix.com/GPX/gpx_style/0/2">
        <color>000000</color>
    </line>
</extensions>
<trkseg>
    <trkpt lat="47.671193" lon="11.886518">
        <ele>1115.6</ele>
        <time>2016-09-15T11:57:44Z</time>
    </trkpt>
    <trkpt lat="47.670686" lon="11.886412">
        <ele>1117.6</ele>
        <time>2016-09-15T11:58:14Z</time>
    </trkpt>
    <trkpt lat="47.670821" lon="11.886459">
        <ele>1055.6</ele>
        <time>2016-09-15T11:58:44Z</time>
    </trkpt>

С помощью скрипта Python я изменяю значения высот, добавляя 30. Пример: До изменения: высота (эле) 1115,6, после изменения: высота (элемент) 1145,6

#This little Python adds 30 to elevation:
import re
f1 = raw_input("name of your GPX file: ")
f1 = open(f1,'r+')
for line in f1:
res = re.search(r"<(ele)>(.+)</\1>",line)
if res:
    number=float(res.group(2))
    number_elev=number+30
    number_elev=str(number_elev)
    ress = re.sub(r"<(ele)>(.+)", r"\2",number_elev)
    #print shows correct new values between <ele> and </ele>
    print ress + "\n"
    ###but how to write into the gpx file these changes?
f1.close()
print "OK"

Ожидается: запись файла с измененными строками. Фактически: я не знаю, как записать изменение с помощью регулярного выражения в файл. Заранее спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Сначала вам нужно прочитать все строки в вашем файле и записать каждую в файл, заменяя те, которые соответствуют поиску регулярных выражений. Кроме того, поскольку еще одна последовательность тегов <ele>..</ele> может находиться в одной строке, вам необходимо найти все вхождения этих строк в строке и соответственно заменить их.

import re
f1 = raw_input("name of your GPX file: ")
with open(f1,'r') as f:
    lines = f.readlines()
with open(f1, 'w') as f:
    for line in lines:
        ress = line
        res = re.findall(r"<(ele)>(.+)</\1>",ress)
        if res:
            for r in res:
                number=float(r[1])
                number_elev=number+30
                number_elev=str(number_elev)
                ress=re.sub(r"<(ele)>{}</(ele)>".format(r[1]), r"<ele>{}</ele>".format(number_elev),string=ress, count=1)
        f.write(ress)
0 голосов
/ 23 января 2019

Вы можете прочитать файл сразу и применить к данным регулярное выражение и записать измененные данные в другой файл следующим образом:

import re

with open('input-file.xml') as fd:
    data = fd.read()

regex = re.compile('(<ele>)([\d.]+)(</ele>)')
while True:
    match = regex.search(data)
    if not match:
        break
    new_value = float(match.group(2)) + 30
    # <ele>6373.8</ele> becomes </ele>6373.8<ele> so that it doesnt match again
    data = regex.sub(r'\g<3>{}\g<1>'.format(new_value), data, count=1)

# undo </ele>...<ele> the tag reversal done inside the while loop
regex = re.compile('(</ele>)([\d.]+)(<ele>)')
data = regex.sub(r'\3\2\1', data)

with open('output-file.xml', 'w') as fd:
    fd.write(data)
0 голосов
/ 23 января 2019

Не пытайтесь одновременно читать и записывать из одного и того же файла.Просто создайте и выведите файл и запишите его.

Следующий код не проверен, но он должен работать.

import re
f1 = input("name of your GPX file: ")
input_file = open(f1,'r+')
output_file = open(f1 + '_output', 'w+')
for line in input_file:
    res = re.search(r"<(ele)>(.+)</\1>", line)
    if res:
        number=float(res.group(2))
        number_elev=number+30
        number_elev=str(number_elev)
        line = line.replace(res.group(2), number_elev)
    output_file.write(line)
input_file.close()
output_file.close()
print("OK")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...