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

2024-06-16 14:56:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这是我文件的一小部分:

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

应为:使用更改的行写入文件。 实际情况:我不知道如何将regexp的更改写入文件。 谢谢你的帮助。你知道吗


Tags: 文件namerenumbertimelineresextensions
3条回答

不要试图同时读写同一个文件。只需创建和输出文件并写入即可。你知道吗

以下代码未经测试,但应该可以运行。你知道吗

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

您可以一次读取所有文件,并将regex应用于数据,然后将修改后的数据写入另一个文件,如下所示:

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)

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

相关问题 更多 >