Pythonはconfigparserを使用して、構成ファイルの詳細な読み取りと書き込みを行います

前書き

ログインと登録用のデモを書きたいのですが、以前のデモデータがプログラムに書き込まれていて、プログラムを閉じるたびにデータが保存されるわけではありません。
そこで、構成ファイルへの書き込みを考えました
。Python自体が、構成ファイルの読み取りと書き込みを行うためのModule-configparserを提供しています。

構成ファイルパーサー。
構成ファイルは、「[section]」ヘッダーで始まり、
その後に「name:value」エントリが続くセクションで構成され、
RFC822のスタイルで継続などがあります。

注Python3では、ConfigParserモジュールの名前がconfigparserに変更されました。2to3ツールは、ソースをPython 3に変換するときに、インポートを自動的に適応させます。

py2では、モジュールはConfigParserと呼ばれ、py3では、文字はすべて小文字です。この記事では、例としてpy3を取り上げます。

クラス

ConfigParserのプロパティとメソッド

ConfigParser -- responsible for parsing a list of
                    configuration files, and managing the parsed database.
 
    methods:
 
    __init__(defaults=None, dict_type=_default_dict, allow_no_value=False,
             delimiters=('=', ':'), comment_prefixes=('#', ';'),
             inline_comment_prefixes=None, strict=True,
             empty_lines_in_values=True, default_section='DEFAULT',
             interpolation=<unset>, converters=<unset>):
        Create the parser. When `defaults' is given, it is initialized into the
        dictionary or intrinsic defaults. The keys must be strings, the values
        must be appropriate for %()s string interpolation.
 
        When `dict_type' is given, it will be used to create the dictionary
        objects for the list of sections, for the options within a section, and
        for the default values.
 
        When `delimiters' is given, it will be used as the set of substrings
        that divide keys from values.
 
        When `comment_prefixes' is given, it will be used as the set of
        substrings that prefix comments in empty lines. Comments can be
        indented.
 
        When `inline_comment_prefixes' is given, it will be used as the set of
        substrings that prefix comments in non-empty lines.
 
        When `strict` is True, the parser won't allow for any section or option
        duplicates while reading from a single source (file, string or
        dictionary). Default is True.
 
        When `empty_lines_in_values' is False (default: True), each empty line
        marks the end of an option. Otherwise, internal empty lines of
        a multiline option are kept as part of the value.
 
        When `allow_no_value' is True (default: False), options without
        values are accepted; the value presented for these is None.
 
        When `default_section' is given, the name of the special section is
        named accordingly. By default it is called ``"DEFAULT"`` but this can
        be customized to point to any other valid section name. Its current
        value can be retrieved using the ``parser_instance.default_section``
        attribute and may be modified at runtime.
 
        When `interpolation` is given, it should be an Interpolation subclass
        instance. It will be used as the handler for option value
        pre-processing when using getters. RawConfigParser objects don't do
        any sort of interpolation, whereas ConfigParser uses an instance of
        BasicInterpolation. The library also provides a ``zc.buildbot``
        inspired ExtendedInterpolation implementation.
 
        When `converters` is given, it should be a dictionary where each key
        represents the name of a type converter and each value is a callable
        implementing the conversion from string to the desired datatype. Every
        converter gets its corresponding get*() method on the parser object and
        section proxies.
 
    sections()
        Return all the configuration section names, sans DEFAULT.
 
    has_section(section)
        Return whether the given section exists.
 
    has_option(section, option)
        Return whether the given option exists in the given section.
 
    options(section)
        Return list of configuration options for the named section.
 
    read(filenames, encoding=None)
        Read and parse the iterable of named configuration files, given by
        name.  A single filename is also allowed.  Non-existing files
        are ignored.  Return list of successfully read files.
 
    read_file(f, filename=None)
        Read and parse one configuration file, given as a file object.
        The filename defaults to f.name; it is only used in error
        messages (if f has no `name' attribute, the string `<???>' is used).
 
    read_string(string)
        Read configuration from a given string.
 
    read_dict(dictionary)
        Read configuration from a dictionary. Keys are section names,
        values are dictionaries with keys and values that should be present
        in the section. If the used dictionary type preserves order, sections
        and their keys will be added in order. Values are automatically
        converted to strings.
 
    get(section, option, raw=False, vars=None, fallback=_UNSET)
        Return a string value for the named option.  All % interpolations are
        expanded in the return values, based on the defaults passed into the
        constructor and the DEFAULT section.  Additional substitutions may be
        provided using the `vars' argument, which must be a dictionary whose
        contents override any pre-existing defaults. If `option' is a key in
        `vars', the value from `vars' is used.
 
    getint(section, options, raw=False, vars=None, fallback=_UNSET)
        Like get(), but convert value to an integer.
 
    getfloat(section, options, raw=False, vars=None, fallback=_UNSET)
        Like get(), but convert value to a float.
 
    getboolean(section, options, raw=False, vars=None, fallback=_UNSET)
        Like get(), but convert value to a boolean (currently case
        insensitively defined as 0, false, no, off for False, and 1, true,
        yes, on for True).  Returns False or True.
 
    items(section=_UNSET, raw=False, vars=None)
        If section is given, return a list of tuples with (name, value) for
        each option in the section. Otherwise, return a list of tuples with
        (section_name, section_proxy) for each section, including DEFAULTSECT.
 
    remove_section(section)
        Remove the given file section and all its options.
 
    remove_option(section, option)
        Remove the given option from the given section.
 
    set(section, option, value)
        Set the given option.
 
    write(fp, space_around_delimiters=True)
        Write the configuration state in .ini format. If
        `space_around_delimiters' is True (the default), delimiters
        between keys and values are surrounded by spaces.

構成ファイルのデータ形式

次のconfig.iniは、構成ファイルのデータ形式を示しています。角括弧[]で囲まれているのは、DefaultやColorなどのセクションです。各セクションには、serveraliveinterval、compressionなどの複数のオプションがあります。
オプションは、キーと値のペアoptionname = valueまたはoptionname:valueと同様に、独自のデータを保存する場所です(null値を許可するように設定することもできます)

[Default]
serveraliveinterval = 45
compression = yes
compressionlevel = 9
forwardx11 = yes
values like this: 1000000
or this: 3.14159265359
[No Values]
key_without_value
empty string value here =

[Color]
isset = true
version = 1.1.0
orange = 150,100,100
lightgreen = 0,220,0

データの種類

py configparserによって保存されたデータでは、valueの値は文字列タイプとして保存され、必要なデータタイプに変換する必要があります。

構成パーサーは、構成ファイル内の値のデータ型を推測せず、常に内部的に文字列として格納します。これは、他のデータ型が必要な場合は、自分で変換する必要があることを意味します。

例えば

>>> int(topsecret['Port'])
50022
>>> float(topsecret['CompressionLevel'])
9.0

一般的に使用される方法

構成ファイルを開く

import configparser

file = 'config.ini'

# 创建配置文件对象
cfg = configparser.ConfigParser(comment_prefixes='#')
# 读取配置文件
cfg.read(file, encoding='utf-8')

ここでのみ開き、読んだり変更したりすることは何もしないでください

構成ファイルのすべてのセクションを読む

ファイルを対応する構成ファイルに置き換えます

import configparser

file = 'config.ini'
cfg = configparser.ConfigParser(comment_prefixes='#')
cfg.read(file, encoding='utf-8')

#  获取所有section
sections = cfg.sections()
#  显示读取的section结果
print(sections)

対応するセクションがあるかどうかを確認してください!!!

直接操作する対応するセクションがない場合、プログラムは異常終了します

import configparser

file = 'config.ini'
cfg = configparser.ConfigParser(comment_prefixes='#')
cfg.read(file, encoding='utf-8')
if cfg.has_section("Default"):  #  有没有"Default" section
    print("存在Defaul section")
else:
	print("不存在Defaul section")	    

セクションの下で対応するオプションを決定します

import configparser

file = 'config.ini'
cfg = configparser.ConfigParser(comment_prefixes='#')
cfg.read(file, encoding='utf-8')
#  检测Default section下有没有"CompressionLevel" option
if cfg.cfg.has_option('Default', 'CompressionLevel'):  
    print("存在CompressionLevel option")
else:
	print("不存在CompressionLevel option")	    

セクションとオプションを追加

最も重要なこと:最後に、保存するファイルを必ず書き込んでください。それ以外の場合、プログラム変更の結果はファイルに変更されません

  1. セクションを追加する前に、セクションが存在するかどうかを確認してください。名前が重複している場合は、エラーが報告され、プログラムが異常終了します。
  2. オプションを追加する前にセクションが存在することを確認してください。存在しない場合は1と同じです。

オプションが変更されたときにオプションが存在しない場合、オプションが作成されます

import configparser

file = 'config.ini'
cfg = configparser.ConfigParser(comment_prefixes='#')
cfg.read(file, encoding='utf-8')

if not cfg.has_section("Color"):  # 不存在Color section就创建
    cfg.add_section('Color')

#  设置sectin下的option的value,如果section不存在就会报错
cfg.set('Color', 'isset', 'true')
cfg.set('Color', 'version', '1.1.0')    
cfg.set('Color', 'orange', '150,100,100')

# 把所作的修改写入配置文件
with open(file, 'w', encoding='utf-8') as configfile:
    cfg.write(configfile)

削除オプション

import configparser

file = 'config.ini'
cfg = configparser.ConfigParser(comment_prefixes='#')
cfg.read(file, encoding='utf-8')

cfg.remove_option('Default', 'CompressionLevel'

# 把所作的修改写入配置文件
with open(file, 'w', encoding='utf-8') as configfile:
    cfg.write(configfile)

セクションを削除

セクションを削除すると、セクションの下にあるすべてのオプションが自動的に再帰的に削除されます。注意して使用してください

import configparser

file = 'config.ini'
cfg = configparser.ConfigParser(comment_prefixes='#')
cfg.read(file, encoding='utf-8')

cfg.remove_section('Default')

# 把所作的修改写入配置文件
with open(file, 'w', encoding='utf-8') as configfile:
    cfg.write(configfile)

インスタンス

構成ファイルを作成する

import configparser

file = 'config.ini'

# 创建配置文件对象
cfg = configparser.ConfigParser(comment_prefixes='#')
# 读取配置文件
cfg.read(file, encoding='utf-8')```

# 实例
## 创建一个配置文件
下面的demo介绍了如何检测添加section和设置value
```python
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :    file.py
@Desc    :    使用configparser读写配置文件demo
@Author  :    Kearney
@Contact :    [email protected]
@Version :    0.0.0
@License :    GPL-3.0
@Time    :    2020/10/20 10:23:52
'''
import configparser

file = 'config.ini'

# 创建配置文件对象
cfg = configparser.ConfigParser(comment_prefixes='#')
# 读取配置文件
cfg.read(file, encoding='utf-8')

if not cfg.has_section("Default"):  #  有没有"Default" section
    cfg.add_section("Default")      #  没有就创建

#  设置"Default" section下的option的value
#  如果这个section不存在就会报错,所以上面要检测和创建
cfg.set('Default', 'ServerAliveInterval', '45')
cfg.set('Default', 'Compression', 'yes')
cfg.set('Default', 'CompressionLevel', '9')
cfg.set('Default', 'ForwardX11', 'yes')

if not cfg.has_section("Color"):  # 不存在Color就创建
    cfg.add_section('Color')

#  设置sectin下的option的value,如果section不存在就会报错
cfg.set('Color', 'isset', 'true')
cfg.set('Color', 'version', '1.1.0')    
cfg.set('Color', 'orange', '150,100,100')
cfg.set('Color', 'lightgreen', '0,220,0')

if not cfg.has_section("User"):  
    cfg.add_section('User')

cfg.set('User', 'iscrypted', 'false')
cfg.set('User', 'Kearney', '[email protected]')
cfg.set('User', 'Tony', '[email protected]')


# 把所作的修改写入配置文件,并不是完全覆盖文件
with open(file, 'w', encoding='utf-8') as configfile:
    cfg.write(configfile)

上記のプログラムを実行すると、config.ini構成ファイルが作成され、次に
示すようにセクションとオプション値ファイルの内容が追加されます。

[Default]
serveraliveinterval = 45
compression = yes
compressionlevel = 9
forwardx11 = yes

[Color]
isset = true
version = 1.1.0
orange = 150,100,100
lightgreen = 0,220,0

[User]
iscrypted = false
kearney = [email protected]
tony = [email protected]


参考文献

おすすめ

転載: blog.csdn.net/weixin_43031092/article/details/109174379