Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2011 12:54:02

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

s0rg
Запись - проходите по элементам словаря склеиваете ключ + ‘ = ’ + значение, добавляете перевод строки, пишите обратно.
Пишите обратно - как записать в нужную строку?



Офлайн

#2 Окт. 26, 2011 12:56:08

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

От регэкспа изначально отказался, считая, что есть более простой способ



Офлайн

#3 Окт. 26, 2011 13:04:59

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

aivs
Пишите обратно - как записать в нужную строку?
ну например так:
f.write('\n'.join( [ '%s = %s' % (k,v) for k, v in my_dict.iteritems()] ) )
Маленькая подсказка - в таком варианте пропадут коментарии и изменится последовательность строк.
Чтобы сохранить последовательность - используйте OrderedDict.
А коментарии - оставляю на ваше усмотрение )

Офлайн

#4 Окт. 26, 2011 13:21:40

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

aivs
От регэкспа изначально отказался, считая, что есть более простой способ
Учитывая, что у вас это уже реализовано на sed я в этом сильно сомневаюсь.



Офлайн

#5 Окт. 26, 2011 13:34:11

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Вообщем простой способ оказался 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)
Правильно ли то, что я файл два раза открываю, один раз на чтение, второй раз на запись ???



Отредактировано (Окт. 26, 2011 13:35:14)

Офлайн

#6 Окт. 26, 2011 14:09:04

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

У вас тут как-то много лишнего. Достаточно прочитать весь файл read-ом, заменить там то, что нужно re.sub и записать обратно write-ом.



Офлайн

#7 Окт. 26, 2011 15:19:40

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Параметр может быть записан:
gateway =
и
gateway = 192.168.1.11

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

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



Отредактировано (Окт. 26, 2011 15:20:08)

Офлайн

#8 Окт. 26, 2011 15:29:31

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

У меня получилось так:

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)
Это не очень эффективно вообще-то, но для такого рода применения сойдет.



Офлайн

#9 Окт. 26, 2011 16:49:53

aivs
От:
Зарегистрирован: 2011-05-26
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

Спасибо, если не затруднит, можете прокомментировать:

re.sub(r'(%s)=.*' % name, r'\1=%s' % value, content)
Комментарии Ваш вариант не обходит!



Отредактировано (Окт. 26, 2011 16:51:43)

Офлайн

#10 Окт. 26, 2011 17:17:13

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг конфигурационного файла. regexp или другое

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)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version