how to replace line on particular line in file[no need to write it back whole file again]

Thomas Jollans tjol at tjol.eu
Thu Oct 11 07:57:57 EDT 2018


On 2018年10月11日 11:44, Iranna Mathapati wrote:
> Hi Team,
>> How to replace particular line text with new text on a file
> i have below code but its writing whole code.
>> def replace_line(file_name, line_num, text):
> lines = open(file_name, 'r').readlines()
> lines[line_num] = text
> out = open(file_name, 'w')
> out.writelines(lines) <<<<< *writing back whole file instead of
> particular line*
> out.close()
> replace_line('stats.txt', 0, 'good')
>>> Thanks,
> Iranna M
>
Can't be done.
There's no easy way to write to the middle of a file (though I think it
can be done by mmap'ing a file) -- and even if you manage to do that,
you'd have to write back anything after the changed line if the length
of that line changed by as little as a byte.
If you really want, you can avoid writing back anything *before* your
change by carefully using truncate():
def replace_line(file_name, line_num, new_text):
 # Use a with statement to make sure the file is closed
 with open(file_name, 'r+') as f:
 # Ignore the first (line_num) lines
 for _ in range(line_num):
 f.readline()
 # Save position, skip the line to be replaced
 line_start = f.tell()
 f.readline()
 # We're keeping the rest of the file:
 remaining_content = f.read()
 # Chop off the file's tail!
 f.seek(line_start)
 f.truncate()
 # Write the new tail.
 if not new_text.endswith('\n'):
 new_text = new_text + '\n'
 f.write(new_text)
 f.write(remaining_content)
That works, but your solution is more elegant.* This solution might make
sense for fairly large files where you can guarantee that the change
will be near the end.
* though you should close the file after you read it, preferable using a
with statement.


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /