1

我正在使用 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)
4

1 回答 1

1

r+选项(在中openwith是告诉 Python 保留文件以前的内容,只是覆盖将写入它的特定字节,但不理会所有其他字节。用于w打开文件以进行完全覆盖,这似乎是您应该在这里做的。覆盖现有文件中选定的字节很少是您想要做的,特别是对于文本文件,您更可能希望将其视为文本行序列,而不是字节串!(它在非常特殊的情况下很有用,主要涉及大型二进制文件,其中逐字节视图可能有意义)。

我们喜欢查看文本文件的“逐行组织”并未反映在底层文件系统中(至少在当前流行的任何操作系统上——在过去的黑暗中,一些文件组织旨在模仿打孔包例如,卡片,所以每行必须正好是 80 个字节,不多也不少……但对于今天的绝大多数计算机程序员和用户来说,这至多是一个遥远的古老记忆;-)。

因此,“就地覆盖文件的一部分”(其中文件包含不同长度的文本行)成为一个相当大的问题。顺便说一句,如果您需要这样做,请考虑fileinput标准 Python 库的模块,它非常有效地模仿了这种经常需要但运行在文件系统的粒度操作上。但是,在这种情况下,它对你没有多大帮助,简单的完全覆盖似乎是完全正确的;-)。

于 2010-09-06T02:07:32.937 回答