0

私の目標は非常に単純ですが、configobj のガイドで見つけることができませんでした。コードを実行すると、ファイルに書き込みますが、ファイルに既にあるものを消去したくありません。

これを実行するたびに、ファイルに既にあるものの下に書き込む必要があります

これは私の現在のコードです: dasd.iniの内容を消去/上書きします

from configobj import ConfigObj

config = ConfigObj()
config.filename = "dasd.ini"
#
config['hey'] = "value1"
config['test'] = "value2"
#
config['another']['them'] = "value4"
#
config.write()
4

3 に答える 3

2

configobj がファイル名の代わりにファイルのようなオブジェクトを受け入れると、これは非常に簡単になります。これは私がコメントで提供した解決策です。

import tempfile
with tempfile.NamedTemporaryFile() as t1, tempfile.NamedTemporaryFile() as t2, open('dasd.ini', 'w') as fyle:
    config = ConfigObj()
    config.filename = t1.file.name
    config['hey'] = "value1"
    config['test'] = "value2"
    config['another']['them'] = "value4"
    config.write()
    do_your_thing_with_(t2)
    t1.seek(0)
    t2.seek(0)
    fyle.write(t2.read())
    fyle.write(t1.read())
于 2013-09-22T12:09:25.117 に答える
0

試してみてください: セクションが既に存在する場合は、セクションのすべてのキーと値を読み取ってから、セクション データ全体を書き込む必要があります。

# -*- coding: cp950 -*-

import configobj
import os

#-------------------------------------------------------------------------
# _readINI(ini_file, szSection, szKey)
# read KeyValue from a ini file
# return True/False, KeyValue
#-------------------------------------------------------------------------
def _readINI(ini_file, szSection, szKey=None):
    ret = None
    keyvalue = None
    if os.path.exists(ini_file) :
        try:
            config = configobj.ConfigObj(ini_file, encoding='UTF8')
            if not szKey==None :
                keyvalue = config[szSection][szKey]
            else:
                keyvalue = config[szSection]

            ret = True
            print keyvalue
        except Exception, e :
            ret = False

    return ret, keyvalue


#-------------------------------------------------------------------------
# _writeINI(ini_file, szSection, szKey, szKeyValue):
# write key value into a ini file
# return True/False
# You have to read all keys and values of the section if the section existed already
# and then write the whole section data 
#-------------------------------------------------------------------------
def _writeINI(ini_file, szSection, szKey, szKeyValue):
    ret = False
    try:
        ret_section = _readINI(ini_file, szSection)

        if not os.path.exists(ini_file) :
            # create a new ini file with cfg header comment
            CreateNewIniFile(ini_file)

        config = configobj.ConfigObj(ini_file, encoding='UTF8')

        if ret_section[1] == None : 
            config[szSection] = {}
        else :
            config[szSection] = ret_section[1]

        config[szSection][szKey] = szKeyValue
        config.write()            

        ret = True
    except Exception, e :
        print str(e)

    return ret


#-------------------------------------------------------------------------
# CreateNewIniFile(ini_file)
# create a new ini with header comment
# return True/False
#-------------------------------------------------------------------------
def CreateNewIniFile(ini_file):
    ret = False
    try:
        if not os.path.exists(ini_file) :

            f= open(ini_file,'w+')
            f.write('########################################################\n')
            f.write('# Configuration File for Parallel Settings of Moldex3D #\n')
            f.write('# Please Do Not Modify This File                       #\n')
            f.write('########################################################\n')
            f.write('\n\n')

            f.close()
            ret = True

    except Exception, e :
        print e

    return ret



#----------------------------------------------------------------------
if __name__ == "__main__":
    path = 'D:\\settings.cfg'
    _writeINI(path, 'szSection', 'szKey', u'kdk12341 他dkdk')
    _writeINI(path, 'szSection', 'szKey-1', u'kdk123412dk')
    _writeINI(path, 'szSection', 'szKey-2', u'kfffk')
    _writeINI(path, 'szSection', 'szKey-3', u'dhhhhhhhhhhhh')
    _writeINI(path, 'szSection-333', 'ccc', u'555')
    #_writeINI(path, 'szSection-222', '', u'')
    print _readINI(path, 'szSection', 'szKey-2')
    print _readINI(path, 'szSection-222')
    #CreateNewIniFile(path)
于 2014-09-18T11:32:06.607 に答える
0

私があなたの質問を正しく理解していれば、あなたが望むことをするのは非常に簡単な変更です. 次の構文を使用して、初期構成オブジェクトを作成します。これにより、既存のファイルからキーと値が読み込まれます。

config = ConfigObj("dasd.ini")

次に、サンプル コードのように、新しい設定を追加したり、既存の設定を変更したりできます。

config['hey'] = "value1"
config['test'] = "value2"

config.write() を使用して書き出すと、dasd.ini ファイルに元のキーと新しいキー/値がマージされていることがわかります。また、各セクションの最後に新しいキー/値が追加され、元の ini ファイルにあったコメントも保持されます。

このリンクをチェックしてください。非常に役立つことがわかりました: An Introduction to ConfigObj

于 2013-10-23T02:59:15.163 に答える