如INI配置文件,这个功能在IE9以上才支持

作者: 编程  发布:2019-09-26

今年底接触Python,实际下载应用以来不到三个月的时光。套用广为流传的一句话,“人生苦短,作者用Python”再妥善不用。

Python版本:Python 3.6.1

前言:

什么是数据驱动?

从它的本意来讲明,正是多少的更立异而使得自动化测量检验的执行,最后引起测量检验结果的改换。说人话,其实就是参数化。


前言:

怎么着是多少驱动?

从它的本意来讲解,就是数额的改动进而使得自动化测量试验的施行,最终引起测量试验结果的改换。说人话,其实正是参数化。


缘起是网址爬虫,对象是合营社内部管理理设施的内网,不堪频繁的手动操作,打起Python的呼吁。短短的三百行的代码,达成了全自动登入、依照规范查找设备列表、远程施行批管理并搜聚结果、下载率性文件及文件夹。大大地加强了工效。

其一模块提供了主导配置方案,你能够在 Python 语言中明白的编写配置文件(ini 文件),然后在极端中轻松配置。

本次介绍2种文件驱动:ini文件和yaml文件


本次介绍2种文件驱动:ini文件和yaml文件


上边就分如下多少个小地点拓宽逐项回想(版本:Python 3.7.0)。

1. 急速入门

让大家看贰个百般基础的配置文件,如下所示:

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no

ini 文件的具体组织大家在底下的章节中陈说。本质上,该公文有三个 sections 和部分键值对构成。 configparser 类能够读写这几个文件。大家能够经过上面包车型地铁主次来编排那么些布局文件。

import configparser

config = configparser.ConfigParser()
config['DEFAULT'] = {'ServerAliveInterval': '45',
                     'Compression': 'yes',
                     'CompressionLevel': '9'}
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Port'] = '50022'     
topsecret['ForwardX11'] = 'no'  
config['DEFAULT']['ForwardX11'] = 'yes'

with open('example.ini', 'w') as configfile:
    config.write(configfile)

正如你所见到的,大家得以像字典同样来布署解析器。今后大家已经创办并保存了一个布置文件,接下去让大家读取那些文件。

import configparser

config = configparser.ConfigParser()
config.read('example.ini')

print(config.sections())
if 'bitbucket.org' in config:
    print(True)
if 'bytebong.com' in config:
    print(True)

print(config['bitbucket.org']['User'])
print(config['DEFAULT']['Compression'])

topsecret = config['topsecret.server.com']
print(topsecret['ForwardX11'])
print(topsecret['Port'])

for key in config['bitbucket.org']: print(key)

print(config['bitbucket.org']['ForwardX11'])

正如小编辈在地方看见的,API设计特轻松。在这之中,最有特点的一个 section 是 DEFAULT 部分,它为全部别的 section 提供私下认可值。还要小心一点,section 中的键值不区分轻重缓急写,並且存款和储蓄在小写中。

一、ini文件

1、定义

前后相继未有别的配置文件,那么它对外是全密封的,一旦程序须求修改部分参数必须求修改程序代码自己并再次编写翻译,为了让程序出厂后仍能依靠供给开展供给的配备,所以要用配置文件;配置文件有许两种,如INI配置文件,XML配置文件,cfg配置文件,还也有正是足以行使系统注册表等。

INI ”就是波兰语 “initialization”的头多少个假名的缩写;当然INI file的后缀名也不自然是".ini"也足以是".cfg",".conf ”或然是".txt"。

2、杰出格式

INI文件的格式异常的粗略,最基本的七个因素是:parameters,sections和comments。

#INI所饱含的最中央的“成分”正是parameter;每二个parameter都有三个name和一个value

#抱有的parameters都以以sections为单位结合在一道的。全体的section名称都是攻下一行,况且sections名字都被方括号包围着,在section证明后的拥有parameters都是属于该section

#在INI文件中comments注释语句是以总局“;”开首的

3、具体文件比方

9159.com 1

4、python读写ini方法

亟待导入Python自带的模块, 用来读写配置文件:

import ConfigParser

读取ini文件:

read(filename):读取ini文件中的内容

sections():获得全体section,重返列表格局

options(section):获得给定section的有着option

items(section):获得钦点section的兼具key-value

get(section,option):得到section中的option值,返回str类型

getint(section,option):得到section中的option值,返回int类型

写入ini文件:

write(filename):写入ini文件中的内容

add_section(section):写入内定section

Set(section,option,value):写入钦赐section中的option的值


5、读取ini文件具体代码模范

import configparser

# ======== Reading mail_config.ini setting ===========

cf = configparser.ConfigParser()

cf.readfp(open("D:\API\config\mail_config.ini"))

smtpserver = cf.get("mail", "smtpserver")

sender = cf.get("mail", "sender")receiver = cf.get("mail", "receiver")

username = cf.get("mail", "username")password = cf.get("mail", "password")


6、写入ini文件具体代码表率

import configparser

# ======== write 1.ini setting ===========

config = configparser.ConfigParser()

# set a number of parameters

config.add_section("book")

9159.com ,config.set("book", "title", "the python standard library")

config.set("book","author", "fredrik lundh")

config.add_section("ematter")

config.set("ematter", "pages","250")

# write to fileconfig.write(open('1.ini', "w"))


一、ini文件

1、定义

前后相继尚未其他配置文件,那么它对外是全封闭的,一旦程序需求修改部分参数须求求修改程序代码自己并再次编写翻译,为了让程序出厂后还是能够依赖需求进行要求的配备,所以要用配置文件;配置文件有很各个,如INI配置文件,XML配置文件,cfg配置文件,还应该有就是足以行使系统注册表等。

INI ”正是瑞典语 “initialization”的头多个字母的缩写;当然INI file的后缀名也不自然是".ini"也得以是".cfg",".conf ”大概是".txt"。

2、非凡格式

INI文件的格式很简短,最基本的三个成分是:parameters,sections和comments。

#INI所满含的最中央的“成分”正是parameter;每八个parameter都有多个name和贰个value

#负有的parameters都以以sections为单位整合在一起的。全数的section名称都以垄断(monopoly)一行,並且sections名字都被方括号包围着,在section声明后的全体parameters都以属于该section

#在INI文件中comments注释语句是以分行“;”开端的

3、具体文件举个例子

4、python读写ini方法

须要导入Python自带的模块, 用来读写配置文件:

import ConfigParser

读取ini文件

read(filename):读取ini文件中的内容

sections():获得全数section,再次来到列表情势

options(section):获得给定section的有所option

items(section):得到钦定section的兼具key-value

get(section,option):得到section中的option值,返回str类型

getint(section,option):得到section中的option值,返回int类型

写入ini文件

write(filename):写入ini文件中的内容

add_section(section):写入钦定section

Set(section,option,value):写入钦赐section中的option的值


5、读取ini文件具体代码模范

import configparser

# ======== Reading mail_config.ini setting ===========

cf = configparser.ConfigParser()

cf.readfp(open("D:\API\config\mail_config.ini"))

smtpserver = cf.get("mail", "smtpserver")

sender = cf.get("mail", "sender")�receiver = cf.get("mail", "receiver")

username = cf.get("mail", "username")�password = cf.get("mail", "password")


6、写入ini文件具体代码模范

import configparser

# ======== write 1.ini setting ===========

config = configparser.ConfigParser()

# set a number of parameters

config.add_section("book")

config.set("book", "title", "the python standard library")

config.set("book","author", "fredrik lundh")

config.add_section("ematter")

config.set("ematter", "pages","250")

# write to file�config.write(open('1.ini', "w"))


0,F12

2. 帮助的数据类型

安顿分析器总是在安顿文件中以字符串的格局积存数据。那就意味着,借使您供给利用任何的数据类型,那么你应有如下操作:

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

唯独,提取布尔值并非那么轻松。就算大家经过 bool() 函数去提取布尔值,那么 bool('False') 值依旧是 True。全数,配置解析器也提供了 getboolean()函数来领取布尔值。那么些艺术是不区分轻重缓急写的,而且能区分 yes/noon/off1/0 等二分类值。比方,

>>> topsecret.getboolean('ForwardX11')
False
>>> config['bitbucket.org'].getboolean('ForwardX11')
True
>>> config.getboolean('bitbucket.org', 'Compression')
True

除了提供 getboolean() 函数,配置分析器还提供了 getint()getfloat() 方法,可是那多少个议程少之又少使用,因为我们选拔 int()float() 方法就足以到达那个职能。

二、yaml文件

1、YAML定义

YAML的官方概念很简单,即“一种人性化的数目格式定义语言”,其首要性功作用途类似于XML或JSON,YAML使用空白字符和支行来分隔数据,且玄妙避开各类密封符号,如:引号、括号等,以幸免那个标识在错综复杂档次结构中变得难以辨认。YAML的语法与高阶语言类似,能够很轻松地发布“体系(java中的list)、杂凑表(java中的map)、标量(java中的基本类型等)”数据结构,它至关心珍重要重申可阅读性。

2、YAML用途

#YAML比较切合做种类化。因为它是宿主语言数据类型直转的。

#YAML做安顿文件也没有错。写YAML要比写XML快得多(**毋庸关心标签或引号**),并且比ini文书档案作用越来越强。

3、YAML vs XML

与YAML相似的多寡格式定义语言是XML,YAML比XML优越性表未来

> - YAML的可读性好

> - YAML和脚本语言的交互性好

> - YAML使用完毕语言的数据类型

> - YAML有贰个一样的音讯模型

> - YAML易于贯彻

地点5条是XML不足的地点,同期,YAML也持有XML的下列优点:

> - YAML能够依据流来管理

> - YAML表明技术强,扩充性好

YAML类似于XML的数量描述语言,语法比XML轻松比很多,YAML试图用一种比XML更迅捷的主意,来产生XML所产生的任务。

4、YAML-对象示例

YAML 支持的数据结构有二种。

#对象:键值对的聚合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

#数组:一组按顺序排列的值,又称为类别(sequence) / 列表(list)

#纯量(scalars):单个的、不可再分的值

9159.com 2

5、python读取YAML文件

代码片段如下:

import yaml

# ======== Reading mail.yaml setting ===========

fr = open("D:\API\config\mail.yaml")

get_config = yaml.load(fr)

smtpserver = get_config["smtpserver"]

sender = get_config["sender"]

receiver = get_config["receiver"]

username = get_config["username"]

password  = get_config["password"]


如上为最简易的用法,我们如有兴趣能够自行延伸学习~~

二、yaml文件

1、YAML定义

YAML的官方概念很简单,即“一种人性化的数码格式定义语言”,其重点职能用途类似于XML或JSON,YAML使用空白字符和支行来分隔数据,且玄妙避开各样密封符号,如:引号、括号等,以制止那个标识在纷纷档案的次序结构中变得难以辨认。YAML的语法与高阶语言类似,能够很轻松地发挥“系列(java中的list)、杂凑表(java中的map)、标量(java中的基本类型等)”数据结构,它根本重申可阅读性。

2、YAML用途

#YAML相比符合做系列化。因为它是宿主语言数据类型直转的。

#YAML做布署文件也情有可原。写YAML要比写XML快得多(**不必关怀标签或引号**),并且比ini文书档案作用更加强。

3、YAML vs XML

与YAML相似的数据格式定义语言是XML,YAML比XML优越性表现在

> - YAML的可读性好

> - YAML和脚本语言的交互性好

> - YAML使用完结语言的数据类型

> - YAML有三个同一的新闻模型

> - YAML易于实现

上边5条是XML不足的地点,同期,YAML也颇具XML的下列优点:

> - YAML能够依照流来处理

> - YAML表明本领强,扩展性好

YAML类似于XML的数码描述语言,语法比XML轻便相当多,YAML试图用一种比XML更神速的章程,来完结XML所变成的天职。

4、YAML-对象示例

YAML 协理的数据结构有三种。

#目的:键值对的集聚,又叫做映射(mapping)/ 哈希(hashes) / 字典(dictionary)

#数组:一组按次序排列的值,又叫做连串(sequence) / 列表(list)

#纯量(scalars):单个的、不可再分的值

5、python读取YAML文件

代码片段如下:

import yaml

# ======== Reading mail.yaml setting ===========

fr = open("D:\API\config\mail.yaml")

get_config = yaml.load(fr)

smtpserver = get_config["smtpserver"]

sender = get_config["sender"]

receiver = get_config["receiver"]

username = get_config["username"]

password  = get_config["password"]


上述为最简易的用法,大家如有兴趣能够自动延伸学习~~

要想扩充有关的网络开支,熟知那几个F12是前提条件。但刚初步也走了些弯路,写下来供参谋。Chrome及其衍生浏览器(如本身常用的360极速)似乎没啥要留心的;IE的话,前提是WIN7暗中同意自带的IE8版本及其以上才支撑,但IE8下开发后独有多个采取卡----HTML、CSS、Javascript、Profiler,贫乏最为关键的Network,那几个意义在IE9上述才支撑。

3. 回退值

用作贰个字典,你能够动用 get() 方法来提供缺省值:

>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher')
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'

请留心,默许值的优先级高于回降值。比方,在我们的例子中 compressionlevel 已经在 DEFAULT 部分中钦命。若是我们从 topsecret.server.com 部分中尝试获得那一个值,那么我们获取的值总是私下认可值,就算你钦定三个回退值。

>>> topsecret.get('CompressionLevel', '3')
'9'

还也许有有些亟需小心的是,get() 方法提供了两个定制的,尤其复杂的界面,並且维持向后宽容性。使用此格局时,能够通过回降关键字仅提供回降值:

>>> config.get('bitbucket.org', 'monster',
...            fallback='No such things as monsters')
'No such things as monsters'

平等的回降参数能够选择 getint()getfloat()getboolean()方法,例如:

>>> 'BatchMode' in topsecret
False
>>> topsecret.getboolean('BatchMode', fallback=True)
True
>>> config['DEFAULT']['BatchMode'] = 'no'
>>> topsecret.getboolean('BatchMode', fallback=True)
False

1,自动登陆

4. INI 文件结构

计划文件由众多的 section 组成,每一种 section 的头顶都以由一个 [section] 标头一您到,接着是一对键值对组合,键值对由特定字符串分隔,比方,= 或者 。私下认可情形下,section 是分别轻重缓急写的,不过键是不区分的。键值对的教导空格和尾巴部分空格都以能够自动删除的。值也得以超越多行,只要它们缩进的深度比值得第一行要深就行了。依照深入分析方式,空白行会被看做多值部分或忽略。

布局文件能够回顾注释,以特定的字符 # 或者 ; 初步。注释或者会并发在一条空行上,也说不定会缩进。

比方下边包车型客车文件:

[Simple Values]
key=value
spaces in keys=allowed
spaces in values=allowed as well
spaces around the delimiter = obviously
you can also use : to delimit keys from values

[All Values Are Strings]
values like this: 1000000
or this: 3.14159265359
are they treated as numbers? : no
integers, floats and booleans are held as: strings
can use the API to get converted values directly: true

[Multiline Values]
chorus: I'm a lumberjack, and I'm okay
    I sleep all night and I work all day

[You can use comments]
# like this
; or this

# By default only in an empty line.
# Inline comments can be harmful because they prevent users
# from using the delimiting characters as parts of values.
# That being said, this can be customized.

    [Sections Can Be Indented]
        can_values_be_as_well = True
        does_that_mean_anything_special = False
        purpose = formatting for readability
        multiline_values = are
            handled just fine as
            long as they are indented
            deeper than the first line
            of a value
        # Did I mention we can indent comments, too?

本条效果实在是新兴才完成的,原因是网址的密码在Post前调用JS函数举行了加密,这里费了些周折。其实通过execjs预先compile该JS文本, 就可call相应的JS函数,第三个参数为函数景况,第叁个起来相继为函数的第二个参数。。。

5. 插补值

配置深入分析器有一个基本的效用,ConfigParser 协理插值。这象征配置文件中的值可以由此预管理获得。

**class configparser.BasicInterpolation**

配备文件是用 ConfigParser 来贯彻暗中认可值。它使值包罗格式字符串,该字符串能够引用同七个 section 中的其余值,也能够是暗中认可 section 中的其余值。并且,我们得以在初步化的时候提供额外的暗许值。

比如:

[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures

在地方那些例子中,插值设置在 BasicInterpolation() 模块中,它能消除 %(home_dir)s 变量赋值的标题,那一个事例中该值为 /Users。再比如,%(my_dir)s 变量在例子中为 /Users/lumberjack

我们得以经过以下顺序来测量检验大家编辑的配备文件。

import configparser

config = configparser.ConfigParser()
config._interpolation = configparser.BasicInterpolation()
config.read('example.ini')

print(config.get('Paths', 'my_dir'))

class configparser.ExtendedInterpolation

插值完结更加尖端的语法代替处理程序,举例这种方式 zc.buildout 。大家须要动用扩大类型的插值完结 ${section: option}。为了有协理起见,假如轻松了 section,那么大家私下认可正是现阶段的 section。

比如说,在基本插值中钦命的陈设,将采纳扩大插值来进行布局:

[Paths]
home_dir: /Users
my_dir: ${home_dir}/lumberjack
my_pictures: ${my_dir}/Pictures

理当如此其它一些的 section 也得以被收取来:

[Common]
home_dir: /Users
library_dir: /Library
system_dir: /System
macports_dir: /opt/local

[Frameworks]
Python: 3.2
path: ${Common:system_dir}/Library/Frameworks/

[Arthur]
nickname: Two Sheds
last_name: Jackson
my_dir: ${Common:home_dir}/twosheds
my_pictures: ${my_dir}/Pictures
python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}

请小心,当大家应用高端插值的时候,我们需求采纳以下语句来展开配置:

config = configparser.ConfigParser()
config._interpolation = configparser.ExtendedInterpolation()

咱俩对上述配置文件的读取程序如下:

import configparser

config = configparser.ConfigParser()
config._interpolation = configparser.ExtendedInterpolation()

config.read('example.ini')

print(config.get('Frameworks', 'path'))
print(config.get('Arthur', 'python_dir'))

其它八个,不要间接行使requests的get或post,而是s = requests.session()生成多个Session后透过这些s来调用get或post就平价多了,再也不用重新指引Header(蕴涵库克ie,User-Agent等央求标头音讯)

6. 传统的 API 例子

重大是思考到向后相当的主题素材,configparser 还提供了思想的 API 情势,get 函数和 set 函数。固然这种措施十二分管用,可是对于新类型来说,大家依然期望能够直接在布署文件中书写配置消息。

写入配置文件的实例:

import configparser

config = configparser.RawConfigParser()

# Please note that using RawConfigParser's set functions, you can assign
# non-string values to keys internally, but will receive an error when
# attempting to write to a file or when you get it in non-raw mode. Setting
# values using the mapping protocol or ConfigParser's set() does not allow
# such assignments to take place.
config.add_section('Section1')
config.set('Section1', 'an_int', '15')
config.set('Section1', 'a_bool', 'true')
config.set('Section1', 'a_float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')

# Writing our configuration file to 'example.cfg'
with open('example.cfg', 'w') as configfile:
    config.write(configfile)

那么,接下去大家来读取那么些布局文件:

import configparser

config = configparser.RawConfigParser()
#config._interpolation = configparser.ExtendedInterpolation()
config._interpolation = configparser.BasicInterpolation()
config.read('example.cfg')

# getfloat() raises an exception if the value is not a float
# getint() and getboolean() also do this for their respective types
a_float = config.getfloat('Section1', 'a_float')
an_int = config.getint('Section1', 'an_int')
print(a_float + an_int)
print(config.get('Section1', 'foo'))
# Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'.
# This is because we are using a RawConfigParser().
if config.getboolean('Section1', 'a_bool'):
    print(config.get('Section1', 'foo'))

来源:docs.python.org

 1 import requests 2 import execjs 3  4 # http地址 5 url = 'http://xx.xx.xx.xxx:8080/pages/' 6  7 ## [加载本地JS] 8 def get_js: 9     f = open(jsFile, 'r', encoding='UTF-8')10     line = f.readline()11     htmlstr = ''12     while line:13         htmlstr += line14         line = f.readline()15     return htmlstr16 17 jsstr = get_js("./JS/Encrypt.js")18 ctx = execjs.compile19 20 ## [执行本地JS加密函数]21 account = 'userid'22 password= 'passwd'23 password2= ctx.call('strEncode', password, account, account, account)24 data = {'account': account, 'password': password2}25 26 ## [模拟登录&生成Session]27 s = requests.session()28 r = s.post(url + "login.do?action=login", data=data)29 if r.status_code==200 and r.text.find('homepage.jsp')>=0:30     loginRt = '登录成功'31 else:32     loginRt = '登录失败'33 print('xxxx管理系统:' + loginRt + ' account=' + account + ' password=******')

2,文件上传

调用sessionr 的post方法,带上files参数就好。

 1 import requests 2  3 # http地址 4 url = 'http://xx.xx.xx.xxx:8080/pages/' 5  6 ## [模拟登录&生成Session] 7 s = requests.session() 8  9 ##[上传文件]10 files = {'file': open('./test.html', 'rb')}11 r = s.post(12     url + "docViewer.do?action=UploadFile&devNo=xxxx&path=D:\",13     files=files)14 15 if r.status_code == 200 and r.text.find('成功') >= 0:16     print('上传成功')17 else:18     print('上传失败')

3,下载文件

调用sessionr 的post方法,央求地址中带上get或post参数就能够。须要注意的写当和姑件时,必须要利用'wb'形式展开,write参数要求采纳r.content并不是r.text,即作为一个二进制文件把乞求的回来原始内容写入。

 1 import requests 2  3 # http地址 4 url = 'http://xx.xx.xx.xxx:8080/pages/' 5  6 ## [模拟登录&生成Session] 7 s = requests.session() 8  9 ##[下载文件(未考虑大文件,需要后续优化)]10 r = s.post(11     url + "docViewer.do?action=DownloadFile&devNo=xxxx" +12     "&fileName=test.html" + "&viewpath=D:\",13 )14 15 fDownloadOK = False16 with open('./test.html', 'wb') as f:17     f.write(r.content)18     fDownloadOK = True19 20 print('下载成功' if fDownloadOK else '下载失败')

4,html解析

解析方法库有许多,作者只利用了最相似的xpath. 起码xpath其十二分的tag、参数、属性啥的,稳步研商下自然有规律的,因为网站的原本新闻正是利用模块生成的并不是单排一行手工业写上去的(除非是故障混淆反爬过,至于怎么反反爬,小编还没读书到)。

 1 import requests 2 from lxml import etree 3  4 # http地址 5 url = 'http://xx.xx.xx.xxx:8080/pages/' 6  7 ## [模拟登录&生成Session] 8 s = requests.session() 9 10 r = s.get(11     url + 'docViewer.do?action=ViewFile&devNo=xxxx' + '&viewpath=D:\',12 )13 html = etree.HTML14 result = html.xpath('//td[@width="25%"]/a/text()')15 16 for e in result:17     print 

5,INI文件读取

引进configparser,直接read整个INI文件,再调用get就能够。但要求注意的是,要是INI文件本人不太标准,就如一section下的key重名,则会报错:configparser.DuplicateOptionError: While reading from 'xxxx.ini' [line xx]: option 'xxx' in section 'yyy' already exists,而那又常常不可制止的。那也许就须求try...except..来机关核查再重读(尚未完结,仅仅是设法)。

1 import configparser2 3 ## [读取INI文件]4 def getINIValue(iniFile, section, key):5     config = configparser.ConfigParser()6     config.read7     return config.get(section, key)

6,Reg文件读取

那些还确实让自家花了些日子去查,如import winreg等等,但那些都以对注册表自己操作实际不是登记表导出后reg文件。再细致一看,大约齐便是INI文件,但直接读会报错:MissingSectionHeaderError: File contains no section headers. 那是因为reg文件的道行会有REGEDIT4或Windows Registry Editor Version 5.00代表注册表版本,而那行内容并不含有在任何三个section内。那说不定也急需try...except..来机关改进再重读(尚未完成,仅仅是费尽脑筋)。

其余还应该有一个索要潜心,注册表项指标名号在reg文件中运用双引号括上,依INI格式读取时索要有觉察地丰裕;还应该有get到的值恐怕是字符串,也恐怕是数值,疑似dword:00000064如此的,也急需独特管理下。

7, 其余有趣的用法

7-1:in 和not in

假设搜索贰个因素是或不是在list中,使用它就对了,注意不要直接接纳index,除非您会诊它就在其间,不然会报错:ValueError: xx is not in list

7-2:类似C++中的三目运算符

OKKKKK if 条件 else NGGGGG

7-3:没有++,和--,只有+=和-=

7-4:整除//,取余数%

本文由9159.com发布于编程,转载请注明出处:如INI配置文件,这个功能在IE9以上才支持

关键词: