Форум сайта python.su
aivsМой пример и тот что выше выдают результат одинаковый, с той же структурой.s0rgИменно так!
Это да - но нужно сохранить первоначальную структуру данных.
Офлайн
Угу, со словарем будет быстрее и красивее.
Офлайн
o7412369815963
Ed
Можете показать вариант со словарем с возможностью редактирования произвольного элемента и сохранением структуры?
Офлайн
Его уже показал o7412369815963, разве нет.
На всякий случай продублирую:
from os import linesep, rename
fname = 'rc.conf'
new_name = '%s.new' % fname
repl = {"interface": "eth0", "address": "192.168.1.100", "netmask": "255.255.255.0", "gateway": "192.168.1.1"}
with open(fname) as inf, open(new_name, 'w') as outf:
for line in inf:
name = line.split('=')[0].split()
if name in repl:
line = "%s=%s%s" % (name, repl[name], linesep)
outf.write(line)
rename(new_name, fname)
Офлайн
Не то - здесь элементы задаются в repl, то есть если нужно будет изменить другой элемент - то нужно будет руками в исходнике изменять этот словарь.
Я имел ввиду изменение произвольного элемента.
Просто задача манипуляции с конфигами довольно-таки частая, я привел в пример свой велосипед )
Но если есть реально более быстрые и красивые варианты - с удовольствием на них посмотрю.
Отредактировано (Ноя. 3, 2011 09:16:53)
Офлайн
Не понял. Вариант со словарем отличается от моего изначального только в лучшую сторону. И в том и в другом если понадобится нечто другое заменять нужно править исходник. Или вы о другом?
Отредактировано (Ноя. 3, 2011 09:22:10)
Офлайн
Предположим что появилась необходимость изменять данные в конфиге в зависимости от каких-либо условий, например:
cat my.conf
PARAM1 = 'a'
PARAM2 = 'b'
[ПСЕВДОКОД]
if conf['PARAM1'] == 'a':
conf['PARAM2'] = 'c'
else:
conf['PARAM2'] = 'd'
Отредактировано (Ноя. 3, 2011 09:31:03)
Офлайн
Все равно не понимаю. Вынесите код в функцию, сделайте repl параметром и меняйте его когда угодно, в чем проблема?
Офлайн
То есть вы предлагаете такой алгоритм:
1. Читаем файл, выкидываем комментарии и сплитим на ключ/значение.
2. Проверяем нужное значение, на основании его создаем repl.
3. Еще раз с начала проходим файл сверяя ключи, и если есть замена в repl то меняем.
?
Некрасиво как-то.
Отредактировано (Ноя. 3, 2011 09:50:18)
Офлайн
Зачем так странно делать? Нет, я предлагаю что-то типа такого:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from os import linesep, rename
def update(fname, repl):
new_name = '%s.new' % fname
with open(fname) as inf, open(new_name, 'w') as outf:
for line in inf:
name = line.split('=')[0].strip()
if name in repl:
line = "%s=%s%s" % (name, repl[name], linesep)
outf.write(line)
rename(new_name, fname)
return 0
def main(argv):
fname = argv[1]
params = argv[2:]
return update(fname, dict(zip(params[::2], params[1::2])))
if __name__ == '__main__':
sys.exit(main(sys.argv))
./updater.py rc.conf interface eth0 address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1
Офлайн