1. 路径问题
这两天用到配置文件,我把一些常用的数据放到了config.ini文件里,以前都是把路径写死的,但是有个大问题,在windows和linux里面的路径表达方式也不一样,这样容易造成不兼容的问题经过查询资料,发现了一个很好的解决方法,一般路径路径问题都可以这样来解决:
比如,我的配置文件路径是这样的:
- 根目录
+ 其他文件夹
+ a文件夹
+ b文件夹
config.ini
c.py
我想在c.py里引用config.ini里面的参数,可以这样写:
# 这里用到python的configparser模块 后面有说明
from configparser import ConfigParser
import os
config = ConfigParser()
config.read(os.path.join(os.getcwd(), 'b文件夹', 'config.ini'), encoding='utf-8-sig')
一般常用到的路径读取方式
"""
os.path.abspath(path) 返回path规范化的绝对路径。
os.path.split(path) 将path分割成目录和文件名二元组返回。
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素。
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。
os.path.commonprefix(list) 返回list中,所有path共有的最长的路径
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False。
os.path.isabs(path) 如果path是绝对路径,返回True。
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False。
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False。
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
os.path.normcase(path) 在Linux和Mac平台上,该函数会原样返回path,在windows平台上会将路径中所有字符转换为小写,并将所有斜杠转换为饭斜杠。
os.path.normpath(path) 规范化路径。
"""
2. 配置文件的读取
ini配置文件的好处在于可以在配置文件中添加多个作用相同参数不同的数据,切换也特别方便,比如我想从一个数据库切到另一个数据库,只需要修改一个参数就可以了。配置文件也可以添加邮箱、url、设置等等一些常用的数据。
前面已经提到,可以用configparser来读取配置文件
这里一些常用的操作:
"""
1.读取
read(filename) 直接读取ini文件内容
sections() 得到所有的section,并以列表的形式返回
options(section) 得到该section的所有option
items(section) 得到该section的所有键值对
get(section,option) 得到section中option的值,返回为string类型
getint(section,option) 得到section中option的值,返回为int类型
(相应的还有getboolean()和getfloat() 函数)
2.写入
add_section(section) 添加一个新的section
set( section, option, value) 对section中的option进行设置
config.write() 写入
"""
读取的例子前面已经有,这里只提一下写入的方法:
# 第一种写法
config["a"] = {'key1': 'val1',
'key2': 'val2',
'key3': 'val3'}
# 第二种写法
config['b'] = {}
config['b']['key4'] = 'val4'
# 第三种写法
config['c'] = {}
topsecret = config['c']
topsecret['key5'] = 'val5' # mutates the parser
topsecret['key6'] = 'val6' # same here
# 写入后缀为.ini的文件 (如果是追加,请用'a'模式写入)
with open('config.ini', 'w') as f:
config.write(f)
运行结果:
[a]
key1 = val1
key2 = val2
key3 = val3
[b]
key4 = val4
[c]
key5 = val5
key6 = val6