Найти - Пользователи
Полная версия: Парсинг конфигурационного файла. regexp или другое
Начало » Python для новичков » Парсинг конфигурационного файла. regexp или другое
1 2 3 4 5 6
aivs
s0rg
Запись - проходите по элементам словаря склеиваете ключ + ‘ = ’ + значение, добавляете перевод строки, пишите обратно.
Пишите обратно - как записать в нужную строку?
aivs
От регэкспа изначально отказался, считая, что есть более простой способ
s0rg
aivs
Пишите обратно - как записать в нужную строку?
ну например так:
f.write('\n'.join( [ '%s = %s' % (k,v) for k, v in my_dict.iteritems()] ) )
Маленькая подсказка - в таком варианте пропадут коментарии и изменится последовательность строк.
Чтобы сохранить последовательность - используйте OrderedDict.
А коментарии - оставляю на ваше усмотрение )
Ed
aivs
От регэкспа изначально отказался, считая, что есть более простой способ
Учитывая, что у вас это уже реализовано на sed я в этом сильно сомневаюсь.
aivs
Вообщем простой способ оказался regexp, вот как я сделал, с помощью regexp нашел номер строки в которой нужный параметр и изменил ее:
#!/usr/bin/python
# parser rc.conf
import re
# Считываем все строки в lines, правим нужную строку и записываем все в файл

#Открываем файл на чтение-запись
config = open('rc.conf' , 'r')

# Cчитываем все строки в lines
lines = config.readlines()

config.close()

# Ищем нужную строку
# номер строки в count
count = 0
for line in lines:
count += 1
# Ищем строку начинающуюся на gateway
if re.match("^gateway", line):
# Чтобы попасть на нужную строку, нужно вычесть 1, пока неосознал...
count -=1
# Заменить строку номер count на свою
lines[count] = "gateway= 192.168.1.2\n"

# Записываем все строки в файл
with open('rc.conf', 'w') as config:
config.writelines(lines)
Правильно ли то, что я файл два раза открываю, один раз на чтение, второй раз на запись ???
Ed
У вас тут как-то много лишнего. Достаточно прочитать весь файл read-ом, заменить там то, что нужно re.sub и записать обратно write-ом.
aivs
Параметр может быть записан:
gateway =
и
gateway = 192.168.1.11

Мне нужно найти строку начинающуюся с gateway и заменить на строку gateway = 192.168.1.1

Подскажите тогда строку для поиска: “Начало строки,gateway,любые символы,конец строки”
Я думал что так: re.sub(“^gateway*$”,“gateway = 192.168.1.1”, text_config)
но не прокатило
Ed
У меня получилось так:
import re

fname = 'rc.conf'

content = open(fname).read()
for name,value in (("interface", "eth0"), ("address", "192.168.1.100"),
("netmask", "255.255.255.0"), ("gateway", "192.168.1.1")):
content = re.sub(r'(%s)=.*' % name, r'\1=%s' % value, content)

with open(fname, 'w') as config:
config.write(content)
Это не очень эффективно вообще-то, но для такого рода применения сойдет.
aivs
Спасибо, если не затруднит, можете прокомментировать:
re.sub(r'(%s)=.*' % name, r'\1=%s' % value, content)
Комментарии Ваш вариант не обходит!
Ed
aivs
Спасибо, если не затруднит, можете прокомментировать:
re.sub(r'(%s)=.*' % name, r'\1=%s' % value, content)
Что именно непонятно? Это регексп, меняет выражения типа <name>=<что угодно до конца строки> на <name>=value

Комментарии Ваш вариант не обходит!
попробуйте так: content = re.sub(r'^(%s)=.*' % name, r'\1=%s' % value, content, flags=re.M)
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