用正则表达式替换的文件中的文本。如何将更改写入文件?

时间:2019-01-23 14:13:11

标签: python regex

我可以逐行更改文件中的文本,但是我不知道如何将结果(更改)写入文件中。

这是我文件的一小部分:

<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来更改高程值。 例:     更改前:     海拔(ele)1115.6,     更改后:     海拔(ele)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 :(得分:0)

不要尝试同时读取/写入同一文件。只需创建并输出文件并将其写入。

以下代码未经测试,但可以正常工作。

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")

答案 1 :(得分:0)

首先,您需要读取文件中的所有行,并将每一行写入文件中,以替换与正则表达式搜索匹配的行。 另外,由于一个<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)

答案 2 :(得分:0)

您可以一次读取所有文件,并将正则表达式应用于数据,然后将修改后的数据写出到另一个文件,如下所示:

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)