Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write at a particular position in text file without erasing original contents?

I've written a code in Python that goes through the file, extracts all numbers, adds them up. I have to now write the 'total' (an integer) at a particular spot in the file that says something something something...Total: __00__ something something.

I have to write the total that I have calculated exactly after the Total: __ part which would mean the resulting line would change to, for example: something something something...Total: __35__ something something.

So far I have this for the write part:

import re
f1 = open("filename.txt", 'r+')
for line in f1:
    if '__' in line and 'Total:' in line:
        location = re.search(r'__', line)
print(location)

This prints out: <_sre.SRE_Match object; span=(21, 23), match='__'>

So it finds the '__' at position 21 to 23, which means I want to insert the total at position 24. I know I have to somehow use the seek() method to do this. But I have tried and failed several times. Any suggestions would be appreciated.

Important: The original contents of the file are to be preserved as it is. Only the total changes -- nothing else.

like image 706
learnerX Avatar asked Dec 03 '15 09:12

learnerX


People also ask

How do I put text in a specific position of a file in Python?

seek() method In Python, seek() function is used to change the position of the File Handle to a given specific position. File handle is like a cursor, which defines from where the data has to be read or written in the file.

What is file seek in Python?

Python File seek() Method The seek() method sets the current file position in a file stream. The seek() method also returns the new postion.


1 Answers

If the file is not particularly large, you can read its contents in memory as a string (or a list of lines), do the replacement and write the contents back. Something like this:

total = 'Total: __{}__'.format(12345)

with open(filename, 'r+') as f:
    contents = f.read().replace('Total: __00__', total)
    f.seek(0)
    f.truncate()
    f.write(contents)
like image 191
Eugene Yarmash Avatar answered Oct 13 '22 01:10

Eugene Yarmash