用ConfigParser替换已存在字符串的问题
我正在使用ConfigParser来保存一些简单的设置到一个.ini文件里,其中一个设置是一个目录。当我把一个目录字符串,比如 D:/Documents/Data
,替换成一个更短的目录字符串,比如 D:/
时,剩下的字符会被放在选项的下面两行。所以现在这个.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)
1 个回答
1
r+
这个选项(在with
中的open
)告诉Python要保留文件之前的内容,只是覆盖特定的字节,而不动其他的字节。如果你想要完全覆盖文件,可以使用w
,这似乎更适合你现在的需求。一般来说,单独覆盖文件中的某些字节很少是你想要的,尤其是对于文本文件,你更希望看到的是一行一行的文本,而不是一堆字节!当然,在一些特殊情况下,比如处理大型二进制文件时,按字节查看可能会有用。
我们喜欢以“按行组织”的方式查看文本文件,但这种方式在底层的文件系统中并没有反映出来(至少在现在流行的操作系统中是这样的——在过去的某些黑暗时期,一些文件组织是为了模仿打孔卡片的方式,比如每一行必须正好是80个字节,不能多也不能少……但这对现在绝大多数程序员和用户来说,已经是遥远的古老记忆了;-)。
所以,“在文件中部分覆盖”就变得相当棘手,尤其是当文件包含不同长度的文本行时。如果你真的需要这样做,可以考虑使用标准Python库中的fileinput
模块,它可以很好的模拟这种常见但又与文件系统不太兼容的操作。不过在你这个情况下,简单的完全覆盖似乎是最合适的选择;-)。