Найти - Пользователи
Полная версия: ConfigParser, редактирование ini
Начало » Python для новичков » ConfigParser, редактирование ini
1
Guljaca
Можно ли отредактировать 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)
reclosedev
Перезаписывать все равно придется, но вот так кодировка сохранится:
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)
Guljaca
А с чего результат записывается одной строкой, но мистические знаки переноса в ней есть? Т.е, если я скопирую эту строку - ее содержимое отобразится на форуме как обычная секция 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')

reclosedev
Просто в нем строки заканчиваются на 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'))
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