Какой самый простой способ в python изменить конфигурационный файл Linux?

#python

#python

Вопрос:

У меня есть несколько скриптов на Python, которые настраивают компьютеры Linux. Одна из задач — изменить файл конфигурации для subversion. Этот файл, ~/.subversion/servers очень прост и выглядит следующим образом:

 # store-passwords = no
# store-plaintext-passwords = no
# store-ssl-client-cert-pp = no
# store-ssl-client-cert-pp-plaintext = no
... lots of other options ...
  

Задача моего скрипта — найти требуемый параметр, например store-plaintext-passwords , и установить для него указанное значение, например yes . Проблема в том, что скрипт может выполняться несколько раз на одном компьютере, поэтому, если он запускается в первый раз, этот параметр можно просто прокомментировать, если он запускается во второй раз, его можно раскомментировать и установить в yes , третий запуск может указать, что он раскомментирован, но установлен в no и т.д. В настоящее время у меня есть довольно сложный код, который ищет строку в файле, разбивает ее на комментарий / имя / значение, при необходимости раскомментирует ее, при необходимости изменяет значение и заменяет его. Может быть, это более простой способ?

Ответ №1:

Файл ~/.subversion/servers находится в формате INI.

Итак, вы можете использовать ConfigParser для реализации всего, что вам нужно.

http://docs.python.org/library/configparser.html

Комментарии:

1. ConfigParser хорош, но как он будет обрабатывать комментарии? Мне не нужно, чтобы в результирующем файле были удалены все прокомментированные поля ^_^

2. никому нет дела до комментариев в автоматически сгенерированных файлах или обработанных файлах

3. @Eye of Hell — ConfigParser поддерживает # и ; комментарии к стилю. Итак, вы готовы зайти сюда. Это не приведет к удалению комментариев.

4.@Senthil Kumaran: configparser игнорирует комментарии; вы потеряете все комментарии, если напишете конфигурационный файл с использованием модуля. ideone.com/3n3Vj ideone.com/sGVnF

5. Дж.Ф. Себастьян — Спасибо, что указали на это. Здесь все еще открытая ошибка: bugs.python.org/issue1410680