Форум сайта python.su
2
Добрый день.
При записи cfg файла, указываю кодировку utf-8.
Но он пишется в ansi. И после записи добавляет 2 пустые строки.
if os.path.exists('cfg.cfg'): pass else: cfg.add_section('set') cfg.set('set','width','800') cfg.set('set','height','600') cfg.set('set','full','0') cfg.set('set','tray','0') cfg.set('set','min_tray','0') with open('cfg.cfg','w',encoding='utf-8') as cfg_file: cfg.write(cfg_file) cfg_file.close()
Офлайн
173
UbhraПросто все буквы английского языка кодируются одним байтом, как в ANSI, потому и определяетя не как utf. Попробуйте добавить что-то на русском
Но он пишется в ansi.
cfg.set('set','test','фыва')
UbhraЖалко что ли?
И после записи добавляет 2 пустые строки.
Офлайн
2
Спасибо. Так сохранило правильно.
А подскажите пожалуйста еще с одной проблемкой.
Я создаю в приведенном выше коде конфигурацию cfg.add_section() и cfg.set(), после удаляю файл и пробую переписать его заново, но он ругается на задваивание. Что то про дубликаты…
Как понял, нужно выгрузить из памяти конфигурацию и задать заново. Как это сделать?
Тоесть в памяти уже есть секция ‘set’ и я пытаюсь ее дублировать вместо перезаписи.
Офлайн
173
Если это не единственная секция, то можно ее удалить remove_section(). Если кроме нее ничего нет, то проще создать новый cfg.
Офлайн
2
Застрял на проверке.
Файл .py
# -*- coding: utf-8 -*- import os,configparser path=('test.cfg') cfg=configparser.ConfigParser() if os.path.exists(path): cfg.read(path) if 0<cfg.getint('section1','option1')<100: if 0<cfg.getint('section1','option2')<100: if 0<cfg.getint('section2','option1')<100: if 0<cfg.getint('section2','option2')<100: print('ok') else: print('error 4') else: print('error 3') else: print('error 2') else: print('error 1') else: print('error file')
[section1] option1 = 40 option2 = 50 [section2] option1 = 40 option2 = 70
No option ‘option2’ in section: ‘section1’
Офлайн
2
Обработал общим исключением:
exception ConfigParser.Error
# -*- coding: utf-8 -*- import os,configparser path=('test.cfg') cfg=configparser.ConfigParser() if os.path.exists(path): try: cfg.read(path) if 0<cfg.getint('section1','option1')<100: if 0<cfg.getint('section1','option2')<100: if 0<cfg.getint('section2','option1')<100: if 0<cfg.getint('section2','option2')<100: print('ok') else: print('error 4') else: print('error 3') else: print('error 2') else: print('error 1') except configparser.Error: print('ex') else: print('error file')
Офлайн
2
Вот, похоже на рабочий вариант. Подскажите пожалуйста что еще забыл или сделал не так?
И можно ли как то условия “ужать”?
# -*- coding: utf-8 -*- import os,configparser path=('test.cfg') cfg=configparser.ConfigParser() if os.path.exists(path): try: cfg.read(path) if 5<cfg.getint('section1','option1')<100: if 10<cfg.getint('section1','option2')<150: if 10<cfg.getint('section2','option1')<120: if 5<cfg.getint('section2','option2')<200: print('ok') except configparser.Error: print('error') else: print('error file')
Отредактировано Ubhra (Апрель 4, 2013 12:39:32)
Офлайн
173
UbhraСмотря чего добиваетесь. Выглядит дико.
Подскажите пожалуйста что еще забыл или сделал не так?
UbhraМожно использовать логическое И.
И можно ли как то условия “ужать”?
if (5 < cfg.getint('section1', 'option1') < 100 and 10 < cfg.getint('section1','option2') < 150 and ... 5 < cfg.getint('section2', 'option2') < 200): ...
validation_rules = { # section, option: min, max ('section1', 'option1'): (5, 100), ('section1', 'option2'): (10, 150), # ... } def validate(cfg, validation_rules): for (section, option), (min_val, max_val) in validation_rules.items(): try: if not (min_val < cfg.get(section, option) < max_val): return False except configparser.Error: return False return True if validate(cfg, validation_rules): ...
Офлайн
2
Спасибо. А дико из-за чего?
Офлайн
173
UbhraИз-за вложенности условий.
А дико из-за чего?
Офлайн