Flaried
Flaried

Reputation: 39

How to replace a line that has a specific text

I want to search for particular text and replace the line if the text is present in that line.

In this code I replace line 125, but want to replace dynamically according to the text:

file = open("config.ini", "r")
lines = file.readlines()
lines[125] = "minimum_value_gain = 0.01" + '\n'
f.writelines(lines)
f.close() 

How do I make it that if a line has:

minimum_value_gain = 

then replace that line with:

minimum_value_gain = 0.01

Upvotes: 2

Views: 788

Answers (5)

leopardxpreload
leopardxpreload

Reputation: 768

  • Set the string you would like to look for (match_string = 'example')

  • Have a list output_list that is empty

  • Use with open(x,y) as z: (this will automatically close the file after completion)

  • for each line in file.readlines() - run through each line of the file

  • The if statement adds your replacement line if the match_string is in the line, else just the adds the line

NOTE: All variables can be any name that is not reserved (don't call something just 'list')

match_string = 'example'
output_list = []

with open("config.ini", "r") as file:
   for line in file.readlines():
       if match_string in line:
           output_list.append('minimum_value_gain = 0.01\n')
       else:
           output_list.append(line)

Maybe not ideal for the first introduction to Python (or more readable) - But I would have done the problem as follows:

with open('config.ini', 'r') as in_file:
    out_file = ['minimum_value_gain = 0.01\n' if 'example' in line else line for line in in_file.readlines()]

Upvotes: 0

Assad Ali
Assad Ali

Reputation: 288

Since you are replacing complete line so if statement will do the trick for you, no need to replace text

#updated make sure one line doesn't have both values

file = open("config.ini", "r")
lines=file.readlines()
newlines = []
for line in lines:
    if "minimum_value_gain" in line:
        line = "minimum_value_gain = 0.01" + '\n'
    if "score_threshold" in line:
        line = "Values you want to add"+'\n'
    newlines.append(line)
f.writelines(newlines)
f.close() 

Upvotes: 1

Catalina Chircu
Catalina Chircu

Reputation: 1574

You can use also the regex library of Python. Here is an example.

It is better not to read and write in the same file, that is not good practice. Write in a different file then eventually rename it.

import re

pattern = 'minimum_value_gain'
string_to_replace = 'minimum_value_gain = 0.01\n'

file = open("config.ini", "r")
fileout = open("new_config.ini", "a")

lines=file.readlines()
newlines = [string_to_replace if re.match(pattern, line) else line for line in lines]

f.close()
fileout.writelines(lines)
fileout.close()

You can rename the file afterwards :

import os
os.remove("config.ini")
os.rename("new_config.ini", "config.ini")

Upvotes: 0

Tomerikoo
Tomerikoo

Reputation: 19430

There is no reason for you to manually parse a config.ini file textually. You should use configparser to make things much simpler. This library reads the file for you, and in a way converts it to a dict so processing the data is much easier. For your task you can do something like:

import configparser

config = configparser.ConfigParser()
config.read("config.ini")
for section in config:
    if config.has_option(section, "minimum_value_gain"):
        config.set(section, "minimum_value_gain", "0.01")

with open("config.ini", 'w') as f:
    config.write(f)

Upvotes: 3

Yagiz Degirmenci
Yagiz Degirmenci

Reputation: 20856

Little bit messy and not optimized but get's the job the, first readlines and inserts the next_text to the given pos(line). If the line doesn't exists Raises IndexError, else writes to the file

def replace_in_file(filename: str, search_text: str, string_to_add: str) -> None:
    with open(filename, "r+") as file_to_write:
        lines = file_to_write.readlines()
        file_to_write.seek(0)
        file_to_write.truncate()
        for line in lines:
            if line.startswith(search_text):
                line = line.rstrip("\n") + string_to_add + "\n"
            file_to_write.write(line)


replace_in_file("sdf.txt", "minimum_value_gain", " = 0.01")

Upvotes: 0

Related Questions