1

ConfigParser を使用して簡単な設定を .ini ファイルに保存しています。これらの設定の 1 つはディレクトリです。D:/Documents/Dataなどのディレクトリ文字列を などの短いディレクトリ文字 列に置き換えるD:/と、残りの文字はオプションの 2 行下に配置されます。したがって、.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+オプション ( 内openの)withは、ファイルの以前の内容を保持するように Python に指示し、ファイルに書き込まれる特定のバイトを上書きするだけで、他のすべてはそのままにします。完全にw上書きするためにファイルを開くために使用します。これは、ここで行うべきことのようです。既存のファイル内の選択したバイトだけを上書きすることは、特にテキストファイルの場合はほとんどありません。バイトの束ではなく、一連のテキスト行として表示する必要があります。(これは、非常に特殊なケースで役立ちます。ほとんどの場合、大規模なバイナリ ファイルが関係しており、バイト単位の表示が意味をなす可能性があります)。

テキストファイルを表示するのに使用する「行ごとの編成」は、基礎となるファイルシステムには反映されていません(少なくとも現在人気のあるOSでは--暗い過去には、一部のファイル編成はパンチされたパックのパックを模倣することを意図していましたたとえば、カードの場合、各行は正確に 80 バイトである必要があり、それ以上でもそれ以下でもありません... しかし、それは今日の大多数のコンピューター プログラマーとユーザーにとって、せいぜい遠い昔の記憶です;-)。

そのため、「ファイルの一部をその場で上書きする」(ファイルにさまざまな長さのテキスト行が含まれている) ことは、かなりの問題になります。ところで、それを行う必要がある場合fileinputは、標準の Python ライブラリのモジュールを検討してください。これは、このしばしば望まれるがファイルシステムに対して実行される粒度の操作を非常に適切に模倣します。しかし、単純な完全上書きが正確に正しいと思われるこの場合、それはあまり役に立ちません;-)。

于 2010-09-06T02:07:32.937 に答える