4

pythonのconfigparserが設定ファイルにセクションを持たずに値を設定する方法はありますか?

そうでない場合は、代替案を教えてください。

ありがとうございました。

詳細情報: 基本的に、次 Name: value の形式の構成ファイルがあります。これは、特定の名前の値を変更したいシステム ファイルです。手動でパーサーを作成するのではなく、モジュールを使用してこれを簡単に実行できるかどうか疑問に思っていました。

4

3 に答える 3

3

このcsvモジュールを使用して、ファイルを解析し、変更を行った後に書き戻す作業のほとんどを実行できます。したがって、比較的使いやすいはずです。Using ConfigParser to read a file without section nameというタイトルの同様の質問に対する回答の1つからアイデアを得ました。

ただし、Python 2 と 3 の両方で動作するようにコーディングしたり、使用するキー/値の区切り文字をハードコーディング解除して、ほとんど何でも (ただし、デフォルトではコロン)、いくつかの変更を加えたりするなど、多くの変更を加えました。最適化。

from __future__ import print_function  # For main() test function.
import csv
import sys
PY3 = sys.version_info.major > 2


def read_properties(filename, delimiter=':'):
    """ Reads a given properties file with each line in the format:
        key<delimiter>value. The default delimiter is ':'.

        Returns a dictionary containing the pairs.

            filename -- the name of the file to be read
    """
    open_kwargs = dict(mode='r', newline='') if PY3 else dict(mode='rb')

    with open(filename, **open_kwargs) as csvfile:
        reader = csv.reader(csvfile, delimiter=delimiter, escapechar='\\',
                            quoting=csv.QUOTE_NONE)
        return {row[0]: row[1] for row in reader}


def write_properties(filename, dictionary, delimiter=':'):
    """ Writes the provided dictionary in key-sorted order to a properties
        file with each line of the format: key<delimiter>value
        The default delimiter is ':'.

            filename -- the name of the file to be written
            dictionary -- a dictionary containing the key/value pairs.
    """
    open_kwargs = dict(mode='w', newline='') if PY3 else dict(mode='wb')

    with open(filename, **open_kwargs) as csvfile:
        writer = csv.writer(csvfile, delimiter=delimiter, escapechar='\\',
                            quoting=csv.QUOTE_NONE)
        writer.writerows(sorted(dictionary.items()))


def main():
    data = {
        'Answer': '6*7 = 42',
        'Knights': 'Ni!',
        'Spam': 'Eggs',
    }

    filename = 'test.properties'
    write_properties(filename, data)  # Create csv from data dictionary.

    newdata = read_properties(filename)  # Read it back into a new dictionary.
    print('Properties read: ')
    print(newdata)
    print()

    # Show the actual contents of file.
    with open(filename, 'rb') as propfile:
        contents = propfile.read().decode()
    print('File contains: (%d bytes)' % len(contents))
    print('contents:', repr(contents))
    print()

    # Tests whether data is being preserved.
    print(['Failure!', 'Success!'][data == newdata])

if __name__ == '__main__':
     main()
于 2013-07-22T20:12:15.787 に答える
0

非常にセクション指向の configparser でそれを行う方法を私は知りません。

別の方法は、Michael Foord による ConfigObjという名前のVoidspace Python モジュールを使用することです。彼が書いた ConfigObj の紹介というタイトルの記事の ConfigObj の利点セクションでは、次のように述べています。

ConfigObj の最大の利点は単純さです。いくつかのキーと値のペアだけが必要な単純な構成ファイルの場合でも、ConfigParser はそれらが「セクション」内にあることを要求します。ConfigObj にはこの制限がなく、構成ファイルをメモリに読み込むと、メンバーへのアクセスは簡単です。

鉱山を強調します。

于 2013-07-19T14:52:02.510 に答える
-1

個人的には、構成ファイルを XML として作成するのが好きです。例 (比較のために ConfigObj の記事から抜粋)では、次の内容のconfig.xmlというファイルを作成できます。

<?xml version="1.0"?>
<config>
  <name>Michael Foord</name>
  <dob>12th August 1974</dob>
  <nationality>English</nationality>
</config>

Python では、次のようにして値を取得できます。

>>> import xml.etree.cElementTree as etree
>>> config = etree.parse("config.xml")
>>> config.find("name").text
'Michael Foord'
>>> config.find("name").text = "Jim Beam"
>>> config.write("config.xml")

config.xmlを見ると、次のように表示されます。

<config>
  <name>Jim Beam</name>
  <dob>12th August 1974</dob>
  <nationality>English</nationality>
</config>

利点は、一般的な XML と同じです。人間が読める形式であり、想像できるほぼすべてのプログラミング言語に既に存在する適切なパーサーが多数あり、グループ化と属性をサポートしています。構成ファイルが大きくなった場合の追加ボーナスとして、XML 検証 (スキーマを使用) を組み込んで、実行前に間違いを見つけることもできます。

于 2013-07-19T17:51:16.520 に答える