Найти - Пользователи
Полная версия: python 3.3 ConfigParser
Начало » Python для новичков » python 3.3 ConfigParser
1 2
Ubhra
Добрый день.
При записи 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()
Как записать в utf-8 без BOM и без пустых строк?
Спасибо.
reclosedev
Ubhra
Но он пишется в ansi.
Просто все буквы английского языка кодируются одним байтом, как в ANSI, потому и определяетя не как utf. Попробуйте добавить что-то на русском
cfg.set('set','test','фыва')
Ubhra
И после записи добавляет 2 пустые строки.
Жалко что ли?
Ubhra
Спасибо. Так сохранило правильно.

А подскажите пожалуйста еще с одной проблемкой.
Я создаю в приведенном выше коде конфигурацию cfg.add_section() и cfg.set(), после удаляю файл и пробую переписать его заново, но он ругается на задваивание. Что то про дубликаты…
Как понял, нужно выгрузить из памяти конфигурацию и задать заново. Как это сделать?
Тоесть в памяти уже есть секция ‘set’ и я пытаюсь ее дублировать вместо перезаписи.
reclosedev
Если это не единственная секция, то можно ее удалить remove_section(). Если кроме нее ничего нет, то проще создать новый cfg.
Ubhra
Застрял на проверке.
Файл .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')
Файл test.cfg
[section1]
option1 = 40
option2 = 50
[section2]
option1 = 40
option2 = 70

Все ошибки отслеживаются отлично (нет файла, значение не в диапазоне 0<100). Но если руками удалить одну строку (например option2 = 50), вылетает ошибка, которую отследить не получилось.
No option ‘option2’ in section: ‘section1’
Ubhra
Обработал общим исключением:
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')
Ubhra
Вот, похоже на рабочий вариант. Подскажите пожалуйста что еще забыл или сделал не так?
И можно ли как то условия “ужать”?
# -*- 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')
reclosedev
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):
    ...
Ubhra
Спасибо. А дико из-за чего?
reclosedev
Ubhra
А дико из-за чего?
Из-за вложенности условий.
И не лучше ли предоставить значения по умолчанию, вместо проверки на присутствие файла и секций?
Нужны ли эти проверки диапазона именно при загрузке? Что будет если пользователь введет неправильные данные? Возможно, логичнее производить проверку непосредственно при вызове функций и выбрасывать исключения, или вообще довериться им?

Не знаю, что это за программа и настройки, ответы на вопросы выше нужны не мне.
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