2010-09-06 1 views
1

Я использую ConfigParser для сохранения простых параметров в файле .ini, и один из этих параметров - это каталог. Всякий раз, когда я заменяю строку каталога, такую ​​как D:/Documents/Data, с более короткой строкой каталога, такой как D:/, остальные символы помещаются в две строки под эту опцию. Таким образом, файл .ini теперь выглядит так:Проблема с заменой уже существующих строк с помощью ConfigParser

[Settings] 
directory = D:/ 

Documents/Data 

Что я делаю неправильно? Вот мой код:

import ConfigParser 

class Settings(): 
    self.config = ConfigParser.ConfigParser() 

    def SetDirectory(self, dir): #dir is the directory string 
     self.config.readfp(open('settings.ini')) 
     self.config.set('Settings', 'directory', dir) 
     with open('settings.ini', 'r+') as configfile: self.config.write(configfile) 

ответ

1

r+ вариант (в open в with) говорит Python, чтобы сохранить предыдущее содержимое файла, просто переписав конкретные байты, которые будут записаны в ней, но оставив в покое все остальные. Используйте w, чтобы открыть файл для завершение переписывание, которое, кажется, то, что вы должны делать здесь. Переписывание только выбранных байтов внутри существующего файла очень редко происходит из-за того, что вы хотите сделать, особенно для файлов , которые вы, скорее всего, захотите увидеть как последовательность строк текста, а не пучки байтов! (Это может быть полезно в очень специализированных случаях, в основном связанных с большими двоичными файлами, где может быть смысл в байтовом представлении).

«Базовая организация», с которой мы хотим просматривать текстовые файлы, не отражается в базовой файловой системе (на любой ОС, которая в настоящее время популярна, по крайней мере - в темном прошлом файловых организаций были например, чтобы имитировать пакеты перфокарт, поэтому каждая строка должна быть ровно 80 байт, не более, не меньше ... но это далекая древняя память, в лучшем случае, для подавляющего большинства компьютерных программистов и пользователей Cегодня;-).

Таким образом, «переписывание части файла на месте» (где файл содержит текстовые строки разной длины) становится довольно сложной задачей. Если вам когда-нибудь понадобится это сделать, обратитесь к модулю fileinput стандартной библиотеки Python, который очень эффективно имитирует эту часто требуемую операцию «только зерно». Но это не поможет вам в этом случае, когда простое полное переписывание, кажется, совершенно правильно ;-).

 Смежные вопросы

  • Нет связанных вопросов^_^