Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 2, 2012 14:00:50

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

ConfigParser, редактирование ini

Можно ли отредактировать ini из кода, не перезаписывая весь файл?
Содержимое ini


quest = text1
answer = text2

config = ConfigParserFix.ConfigParser()
text = config.readfp(codecs.open("dialog.ini", "w", "utf-8-sig"))

При записи в файл, меняется его кодировка. Как оставить Utf-8?
text.write(text)



Отредактировано Guljaca (Окт. 2, 2012 15:04:22)

Офлайн

#2 Окт. 2, 2012 15:58:31

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

ConfigParser, редактирование ini

Перезаписывать все равно придется, но вот так кодировка сохранится:

import ConfigParser
import codecs
 
config = ConfigParser.ConfigParser()
with codecs.open('dialog.ini', encoding='utf-8-sig') as f:
    config.readfp(f)
 
config.set('test', 'quest2', 'asdf')
with codecs.open('dialog.ini', 'w', encoding='utf-8-sig') as f:
    config.write(f)

Отредактировано reclosedev (Окт. 2, 2012 15:59:56)

Офлайн

#3 Окт. 2, 2012 22:53:39

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

ConfigParser, редактирование ini

А с чего результат записывается одной строкой, но мистические знаки переноса в ней есть? Т.е, если я скопирую эту строку - ее содержимое отобразится на форуме как обычная секция ini

char_config = ConfigParserFix.ConfigParser()
            # Открываю файл для записи
            text = codecs.open(r"ini/dialog.ini", "w", encoding='utf-8-sig')
            for theme in dialog:
                quest = self.quest.text()
                quest = unicode(quest)
                answer = self.answer.text()
                answer = unicode(answer)
                dialog[theme].answer.append(answer)
                dialog[theme].quest.append(quest)
            for theme in dialog:
                fix = '[' + theme + ']'
                # Добовляю в список строку
                text.write(fix+'\n')
                fix = 'quest ='
                for qt  in xrange(0,len(dialog[theme].quest)):
                    fix += dialog[theme].quest[qt] + ' '
                text.write(fix+'\n')
                fix = 'answer ='
                for qt in xrange(0,len(dialog[theme].answer)):
                    fix += dialog[theme].answer[qt] + ' '
                text.write(fix+'\n')



Отредактировано Guljaca (Окт. 2, 2012 23:06:21)

Офлайн

#4 Окт. 3, 2012 18:32:20

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

ConfigParser, редактирование ini

Просто в нем строки заканчиваются на LF (как nix системах) вместо CRLF. Нормальный текстовый редактор должен их поддерживать.

Оказывается виновник этого - codecs.open()

Note Files are always opened in binary mode, even if no binary mode was specified. This is done to avoid data loss due to encodings using 8-bit values. This means that no automatic conversion of ‘\n’ is done on reading and writing.
Решение с меньшим переписыванием логики сохранения:
import ConfigParser
import codecs
import StringIO
  
config = ConfigParser.ConfigParser()
...
buf = StringIO.StringIO()
config.write(buf)
with codecs.open('dialog.ini', 'w', encoding='utf-8-sig') as f:
    f.write(buf.getvalue().replace('\n', '\r\n'))

Отредактировано reclosedev (Окт. 3, 2012 18:33:27)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version