Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 3, 2013 09:21:23

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Добрый день.
При записи 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 и без пустых строк?
Спасибо.



Офлайн

#2 Апрель 3, 2013 18:19:09

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Ubhra
Но он пишется в ansi.
Просто все буквы английского языка кодируются одним байтом, как в ANSI, потому и определяетя не как utf. Попробуйте добавить что-то на русском
cfg.set('set','test','фыва')
Ubhra
И после записи добавляет 2 пустые строки.
Жалко что ли?

Офлайн

#3 Апрель 3, 2013 19:16:30

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Спасибо. Так сохранило правильно.

А подскажите пожалуйста еще с одной проблемкой.
Я создаю в приведенном выше коде конфигурацию cfg.add_section() и cfg.set(), после удаляю файл и пробую переписать его заново, но он ругается на задваивание. Что то про дубликаты…
Как понял, нужно выгрузить из памяти конфигурацию и задать заново. Как это сделать?
Тоесть в памяти уже есть секция ‘set’ и я пытаюсь ее дублировать вместо перезаписи.



Офлайн

#4 Апрель 3, 2013 19:21:21

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Если это не единственная секция, то можно ее удалить remove_section(). Если кроме нее ничего нет, то проще создать новый cfg.

Офлайн

#5 Апрель 3, 2013 23:13:41

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Застрял на проверке.
Файл .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’



Офлайн

#6 Апрель 4, 2013 11:26:59

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Обработал общим исключением:
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')



Офлайн

#7 Апрель 4, 2013 12:36:59

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Вот, похоже на рабочий вариант. Подскажите пожалуйста что еще забыл или сделал не так?
И можно ли как то условия “ужать”?

# -*- 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)

Офлайн

#8 Апрель 4, 2013 17:32:07

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

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):
    ...

Офлайн

#9 Апрель 4, 2013 17:37:48

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Спасибо. А дико из-за чего?



Офлайн

#10 Апрель 4, 2013 17:52:24

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

python 3.3 ConfigParser

Ubhra
А дико из-за чего?
Из-за вложенности условий.
И не лучше ли предоставить значения по умолчанию, вместо проверки на присутствие файла и секций?
Нужны ли эти проверки диапазона именно при загрузке? Что будет если пользователь введет неправильные данные? Возможно, логичнее производить проверку непосредственно при вызове функций и выбрасывать исключения, или вообще довериться им?

Не знаю, что это за программа и настройки, ответы на вопросы выше нужны не мне.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version