Форум сайта python.su
Есть конфигурационный файл rc.conf из Arch Linux
#
# /etc/rc.conf - Main Configuration for Arch Linux
#
# -----------------------------------------------------------------------
# LOCALIZATION
# -----------------------------------------------------------------------
LOCALE="ru_RU.UTF-8"
HARDWARECLOCK="localtime"
TIMEZONE="Europe/Moscow"
KEYMAP="us"
CONSOLEFONT=ter-u16b
CONSOLEMAP=
USECOLOR="yes"
# -----------------------------------------------------------------------
# HARDWARE
# -----------------------------------------------------------------------
MOD_AUTOLOAD="yes"
MODULES=()
# Scan for LVM volume groups at startup, required if you use LVM
USELVM="no"
# -----------------------------------------------------------------------
# NETWORKING
# -----------------------------------------------------------------------
HOSTNAME="myhost"
interface=eth0
address=
netmask=
gateway=
# -----------------------------------------------------------------------
# DAEMONS
# -----------------------------------------------------------------------
DAEMONS=(syslog-ng @network ntpd crond dbus sshd samba transmissiond)
Офлайн
Из стандартной библиотеки configparser смотрели? http://docs.python.org/library/configparser.html
Офлайн
Стандартный ConfigParser не может читать ini файлы без секций, для обхода есть такое решение http://stackoverflow.com/questions/2819696/parsing-properties-file-in-python/2819788
Офлайн
Пытаюсь обойти секции с помощью предложенного метода, но происходит ошибка.
#!/usr/bin/python
# parse_rc.conf.py
import configparser
class FakeSecHead(object):
def __init__(self, fp):
self.fp = fp
self.sechead = '[asection]\n'
def readline(self):
if self.sechead:
try: return self.sechead
finally: self.sechead = None
else: return self.fp.readline()
config = configparser.SafeConfigParser()
config.readfp(FakeSecHead(open('rc.conf')))
config.items('asection')
[aivs@myhost python]$ ./parse_rc.conf.py
Traceback (most recent call last):
File "./parse_rc.conf.py", line 16, in <module>
config.readfp(FakeSecHead(open('rc.conf')))
File "/usr/lib/python3.2/configparser.py", line 753, in readfp
self.read_file(fp, source=filename)
File "/usr/lib/python3.2/configparser.py", line 708, in read_file
self._read(f, source)
File "/usr/lib/python3.2/configparser.py", line 994, in _read
for lineno, line in enumerate(fp, start=1):
TypeError: 'FakeSecHead' object is not iterable
[aivs@myhost python]$
Офлайн
Проблема в том, что грязный хак, который вам посоветовали был для второго Питона.
Для третьего все проще:
import configparser
parser = configparser.SafeConfigParser()
parser.read_string("[section]\n" + open('rc.conf').read())
print(parser.items('section'))
Отредактировано (Окт. 25, 2011 22:54:25)
Офлайн
Ed спасибо, блин, а я перевод сделал для 2.7!
А возможно ли этим парсером не только читать, но и записывать в конфиг с таким стилем не испортив его, попробовал записать в этот конфиг, вот код
#!/usr/bin/python
# parse_rc.conf.py
import configparser
config = configparser.SafeConfigParser()
config.read_string("[section]\n" + open('rc.conf').read())
config.set('section', 'gateway', '192.168.1.1')
with open('rc.conf', 'w') as configfile:
config.write(configfile)
[section]
locale = "ru_RU.UTF-8"
hardwareclock = "localtime"
timezone = "Europe/Moscow"
keymap = "us"
consolefont = ter-u16b
consolemap =
usecolor = "yes"
mod_autoload = "yes"
modules = ()
uselvm = "no"
hostname = "myhost"
interface = eth0
address =
netmask =
gateway = 192.168.1.1
daemons = (syslog-ng @network ntpd crond dbus sshd samba transmissiond)
Отредактировано (Окт. 26, 2011 10:56:25)
Офлайн
aivsЕсли нужно убрать пробелы вокруг = и вывод секции убрать, то возможно, пронаследовав свой парсер от SafeConfigParser и немного исправив метод write. Если я чего-то недосмотрел, то скажите что еще нужно сделать.
А возможно ли этим парсером не только читать, но и записывать в конфиг с таким стилем не испортив его
aivsКхе-кхе. Не забывайте, что это парсер .ini файлов, а не того, что вы ему подсовываете. И в этом качестве он свою задачу выполняет.
А мне всего то надо было изменить значение у gateway.
Отредактировано (Окт. 26, 2011 11:32:47)
Офлайн
Рассматривая второй вариант, написать свой парсер, т.к. я еще учусь, многих простых вариантов решения не вижу.
Задача:
Изменять значения в конфиге типа:
# Комментарий
Параметр_1 = значение_1
Параметр_2 = значение_2
Офлайн
Я бы попользовал регекспы. Читайте здесь: http://docs.python.org/py3k/library/re.html
Офлайн
Прочитать файл по-строчно.
Разбить строку по ‘=’ на две части - имя и значение.
Засунуть в словарь, используя имя как ключ.
Чтобы теперь прочитать значение то используете my_dict
Запись - проходите по элементам словаря склеиваете ключ + ‘ = ’ + значение, добавляете перевод строки, пишите обратно.
Офлайн