Skip to content Skip to sidebar Skip to footer

Text In A File Replaced By Regex. How To Write The Change Into File?

I can change the text in a file line by line, but I don't know how to write the results (changes) into the file. This is a small part of my file: 2016-09-15_obere-first

Solution 1:

You'll first need to read all the lines in your file and write each one to the file replacing the ones matching the regex search. Also since one more <ele>..</ele> tag sequences can be on the same line, you'll need to find all occurrences of those in the line and replace them accordingly.

import re
f1 = raw_input("name of your GPX file: ")
withopen(f1,'r') as f:
    lines = f.readlines()
withopen(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)

Solution 2:

Don't try to read and write from/to the same file at the same time. Just create and output file and write to it.

The following code is untested but it should work.

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

Solution 3:

You can read the file all at once and apply the regex to the data and write out the modified data to another file as follows:

import re

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

regex = re.compile('(<ele>)([\d.]+)(</ele>)')
whileTrue:
    match = regex.search(data)
    ifnot 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)

withopen('output-file.xml', 'w') as fd:
    fd.write(data)

Post a Comment for "Text In A File Replaced By Regex. How To Write The Change Into File?"