用ConfigParser替换已存在字符串的问题

1 投票
1 回答
595 浏览
提问于 2025-04-16 03:45

我正在使用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模块,它可以很好的模拟这种常见但又与文件系统不太兼容的操作。不过在你这个情况下,简单的完全覆盖似乎是最合适的选择;-)。

撰写回答