Найти - Пользователи
Полная версия: Парсинг конфигурационного файла. regexp или другое
Начало » Python для новичков » Парсинг конфигурационного файла. regexp или другое
1 2 3 4 5 6
o7412369815963
aivs
s0rg
Это да - но нужно сохранить первоначальную структуру данных.
Именно так!
Мой пример и тот что выше выдают результат одинаковый, с той же структурой.
Ed
Угу, со словарем будет быстрее и красивее.
s0rg
o7412369815963
Ed
Можете показать вариант со словарем с возможностью редактирования произвольного элемента и сохранением структуры?
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)
s0rg
Не то - здесь элементы задаются в repl, то есть если нужно будет изменить другой элемент - то нужно будет руками в исходнике изменять этот словарь.
Я имел ввиду изменение произвольного элемента.
Просто задача манипуляции с конфигами довольно-таки частая, я привел в пример свой велосипед )
Но если есть реально более быстрые и красивые варианты - с удовольствием на них посмотрю.
Ed
Не понял. Вариант со словарем отличается от моего изначального только в лучшую сторону. И в том и в другом если понадобится нечто другое заменять нужно править исходник. Или вы о другом?
s0rg
Предположим что появилась необходимость изменять данные в конфиге в зависимости от каких-либо условий, например:
cat my.conf

PARAM1 = 'a'
PARAM2 = 'b'

[ПСЕВДОКОД]

if conf['PARAM1'] == 'a':
conf['PARAM2'] = 'c'
else:
conf['PARAM2'] = 'd'
Ed
Все равно не понимаю. Вынесите код в функцию, сделайте repl параметром и меняйте его когда угодно, в чем проблема?
s0rg
То есть вы предлагаете такой алгоритм:
1. Читаем файл, выкидываем комментарии и сплитим на ключ/значение.
2. Проверяем нужное значение, на основании его создаем repl.
3. Еще раз с начала проходим файл сверяя ключи, и если есть замена в repl то меняем.

?

Некрасиво как-то.
Ed
Зачем так странно делать? Нет, я предлагаю что-то типа такого:
#!/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
PS: Естетственно парсинг и валидация параметров отсутствует, это чисто чтобы идею показать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB