Форум сайта python.su
0
Можно ли отредактировать ini из кода, не перезаписывая весь файл?
Содержимое ini
quest = text1
answer = text2
config = ConfigParserFix.ConfigParser() text = config.readfp(codecs.open("dialog.ini", "w", "utf-8-sig"))
text.write(text)
Отредактировано Guljaca (Окт. 2, 2012 15:04:22)
Офлайн
173
Перезаписывать все равно придется, но вот так кодировка сохранится:
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)
Офлайн
0
А с чего результат записывается одной строкой, но мистические знаки переноса в ней есть? Т.е, если я скопирую эту строку - ее содержимое отобразится на форуме как обычная секция 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)
Офлайн
173
Просто в нем строки заканчиваются на 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)
Офлайн