简介
想写一个登录注册的demo,但是以前的demo数据都写在程序里面,每一关掉程序数据就没保存住。。
于是想着写到配置文件里好了
Python自身提供了一个Module - configparser,来进行对配置文件的读写
Configuration file parser.
A configuration file consists of sections, lead by a “[section]” header,
and followed by “name: value” entries, with continuations and such in
the style of RFC 822.
Note The ConfigParser module has been renamed to configparser in Python 3. The 2to3 tool will automatically adapt imports when converting your sources to 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 `<"color: #ff0000">配置文件的数据格式下面的config.ini展示了配置文件的数据格式,用中括号[]括起来的为一个section例如Default、Color;每一个section有多个option,例如serveraliveinterval、compression等。
option就是我们用来保存自己数据的地方,类似于键值对 optionname = value 或者是optionname : value (也可以设置允许空值)[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的值都保存为字符串类型,需要自己转换为自己需要的数据类型
Config parsers do not guess datatypes of values in configuration files, always storing them internally as strings. This means that if you need other datatypes, you should convert on your own:
例如
> int(topsecret['Port']) 50022 > float(topsecret['CompressionLevel']) 9.0常用方法method
打开配置文件
import configparser file = 'config.ini' # 创建配置文件对象 cfg = configparser.ConfigParser(comment_prefixes='#') # 读取配置文件 cfg.read(file, encoding='utf-8')这里只打开不做什么读取和改变
读取配置文件的所有section
file处替换为对应的配置文件即可
import configparser file = 'config.ini' cfg = configparser.ConfigParser(comment_prefixes='#') cfg.read(file, encoding='utf-8') # 获取所有section sections = cfg.sections() # 显示读取的section结果 print(sections)判断有没有对应的section!!!
当没有对应的section就直接操作时程序会非正常结束
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")判断section下对应的Option
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")添加section和option
最最重要的事情: 最后一定要写入文件保存!!!不然程序修改的结果不会修改到文件里
- 添加section前要检测是否存在,否则存在重名的话就会报错程序非正常结束
- 添加option前要确定section存在,否则同1
option在修改时不存在该option就会创建该option
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)
删除option
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)
删除section
删除section的时候会递归自动删除该section下面的所有option,慎重使用
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 : 191615342@qq.com @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', '191615342@qq.com') cfg.set('User', 'Tony', 'backmountain@gmail.com') # 把所作的修改写入配置文件,并不是完全覆盖文件 with open(file, 'w', encoding='utf-8') as configfile: cfg.write(configfile)
跑上面的程序就会创建一个config.ini的配置文件,然后添加section和option-value
文件内容如下所示
[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 = 191615342@qq.com tony = backmountain@gmail.com
References
Configuration file parser - py2
Configuration file parser - py3
python读取配置文件(ini、yaml、xml)-ini只读不写。。
python 编写配置文件 - open不规范,注释和上一篇参考冲突
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】
- 谭咏麟.2022-倾·听【环球】【WAV+CUE】
- 4complete《丛生》[320K/MP3][85.26MB]
- 4complete《丛生》[FLAC/分轨][218.01MB]