Могу ли я удалить конкретное значение в разделе файла config.ini с помощью Python configparser?

У меня есть файл config.ini, и я пытаюсь удалить определенное значение в разделе моего файла config.ini. Я в основном хочу удалить индекс в списке. Файл config.ini:

[INPUT]
intervals = [[4000, 6000], [25000, 55000]]

Например, я хочу удалить [4000, 6000], чтобы новый файл config.ini стал следующим:

[INPUT]
intervals = [[25000, 55000]]

Мой код ниже с двумя функциями: одна для импорта содержимого config.ini (load_args()), а другая для удаления раздела config.ini (delete_args()). Функция удаления основана на ответе на Как удалить раздел из ini-файла с помощью Python ConfigParser?

import configparser
import ast

def load_args():
    config = configparser.ConfigParser()
    config.read('config.ini')
    interval = ast.literal_eval(config['INPUT']['intervals'])
    print(interval)

load_args()

def delete_args():
    config = configparser.ConfigParser()
    with open('config.ini', 'r+') as s:
        config.readfp(s)  
        config.remove_section('INPUT')
        s.seek(0)
        config.write(s)
        s.truncate()
        interval = ast.literal_eval(config['INPUT']['intervals'])
        print(interval)

delete_args()

Текущая функция delete_args() выше удаляет все в config.ini. Я понимаю, что delete_args() нужен способ найти значение [4000, 6000] в config.ini, поэтому мне было интересно, можно ли передать [4000, 6000] в качестве аргумента в delete_args(), который затем находит раздел [INPUT] и находит указанный интервал ([4000, 6000]) в пределах intervals и удаляет его.


person W. Churchill    schedule 26.06.2020    source источник


Ответы (2)


Если я вас правильно понимаю, вы хотите удалить определенный интервал из многомерного списка по аргументу в вашей функции delete_args при обновлении config.ini. Я придумал это решение:

import configparser 
import ast

parser = configparser.ConfigParser()
interval = []

def load_args():
    global interval
    parser.read('config.ini')
    interval = ast.literal_eval(parser['INPUT']['intervals'])
    print(interval)

load_args()

def delete_args(index):
    global interval
    interval.pop(index)
    parser.set('INPUT', 'intervals', str(interval))
    with open("config.ini", "w+") as configfile:
        parser.write(configfile)

def delete_args2(ele):
    global interval
    interval = [x for x in interval if x != ele]
    parser.set('INPUT', 'intervals', str(interval))
    with open("config.ini", "w+") as configfile:
        parser.write(configfile)

#delete_args(0)
delete_args2([4000, 6000])

delete_args(0)

load_args()

Выход

[[4000, 6000], [25000, 55000]]
[[25000, 55000]]

Я использовал немного другую стратегию обновления и просто pop() элемент по указанному индексу. Я думаю, что это очень чистый способ. Если вы предпочитаете передавать значение для удаления, вы можете использовать interval.remove(ele) или что-то более надежное, например [x for x in interval if x != ele], вместо pop(index). Примечание. Я определил interval глобально для простоты, но это не важно.

person wp78de    schedule 29.06.2020

Это немного другой подход, но все же может работать для вашей цели. Вместо удаления intervals мы можем обновить его следующим образом:

import configparser


def update_args(section, element, value):
    config = configparser.ConfigParser()
    config.read('config.ini')
    config.set(section, element, value)
    with open('config.ini', 'w') as f:
        config.write(f)


update_args("INPUT", "intervals", "[25000, 55000]")

Кстати, я только что услышал о ini файлах здесь в этом вопросе и пытаюсь решить эту проблему. Итак, я надеюсь, что я не сделал что-то совершенно не связанное с вопросом.

person Sercan    schedule 29.06.2020