我正在使用 ConfigParser 将简单设置保存到 .ini 文件,其中一个设置是目录。每当我用较短的目录字符串(例如 D:/
)替换目录字符串(例如 D:/Documents/Data
)时,剩余的字符将在选项下放置两行。所以 .ini 文件现在看起来像这样:
[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)
最佳答案
r+
选项(在 with
中的 open
中)告诉 Python 保留文件以前的内容,只是覆盖特定字节它将被写入其中,但不会影响所有其他内容。使用 w
打开文件进行完全覆盖,这似乎是您应该在这里做的事情。您很少会想要覆盖现有文件中选定的字节,特别是对于文本文件,您更可能希望将其视为文本行序列,而不是一堆文本字节! (它在非常特殊的情况下很有用,主要涉及大型二进制文件,其中按字节 View 可能有意义)。
我们用来查看文本文件的“按行组织”并没有反射(reflect)在底层文件系统中(至少在当前流行的任何操作系统上 - 早在黑暗的过去一些 例如,文件组织是为了模仿打洞卡包,因此每行必须恰好是 80 字节,不多不少……但这对于绝大多数人来说至多是一个遥远的古老内存当今的计算机程序员和用户;-)。
因此,“就地覆盖文件的一部分”(文件包含不同长度的文本行)成为一个很大的问题。顺便说一句,如果您需要这样做,请考虑标准 Python 库的 fileinput 模块,它非常有效地模仿了这种经常需要的但针对文件系统的粒度运行的操作。但是,在这种情况下,它不会对您有太大帮助,因为简单的完全覆盖似乎是完全正确的;-)。
关于python - 使用 ConfigParser 替换已存在的字符串时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3648612/