Python读取配置文件-ConfigParser的二次封装方法
程序员文章站
2022-03-02 12:25:07
目录python读取配置文件-configparser二次封装直接上上代码读取配置文件&&简单封装1.configparser模块2.configparser读取文件的基本方法3.引入...
python读取配置文件-configparser二次封装
直接上上代码
test.conf
[database] connect = mysql sleep = no test = yes
config.py
# -*- coding:utf-8 -*- __author__ = 'guoqianqian' import os import configparser import os current_dir = os.path.abspath(os.path.dirname(__file__)) class operationalerror(exception): """operation error.""" class dictionary(dict): """ custom dict.""" def __getattr__(self, key): return self.get(key, none) __setattr__ = dict.__setitem__ __delattr__ = dict.__delitem__ class config: def __init__(self, file_name="test", cfg=none): """ @param file_name: file name without extension. @param cfg: configuration file path. """ env = {} for key, value in os.environ.items(): if key.startswith("test_"): env[key] = value config = configparser.configparser(env) if cfg: config.read(cfg) else: config.read(os.path.join(current_dir, "conf", "%s.conf" % file_name)) for section in config.sections(): setattr(self, section, dictionary()) for name, raw_value in config.items(section): try: # ugly fix to avoid '0' and '1' to be parsed as a # boolean value. # we raise an exception to goto fail^w parse it # as integer. if config.get(section, name) in ["0", "1"]: raise valueerror value = config.getboolean(section, name) except valueerror: try: value = config.getint(section, name) except valueerror: value = config.get(section, name) setattr(getattr(self, section), name, value) def get(self, section): """get option. @param section: section to fetch. @return: option value. """ try: return getattr(self, section) except attributeerror as e: raise operationalerror("option %s is not found in " "configuration, error: %s" % (section, e)) if __name__ == "__main__": conf = config() print conf.get("database").connect print conf.get("database").sleep print conf.get("database").test
执行结果
mysql
false
true
目录结构
demo conf test.conf config.py
读取配置文件&&简单封装
之前有做过把爬虫数据写到数据库中的练习,这次想把数据库信息抽离到一个ini配置文件中,这样做的好处在于可以在配置文件中添加多个数据库,方便切换(另外配置文件也可以添加诸如邮箱、url等信息)
1.configparser模块
python使用自带的configparser模块用来读取配置文件,配置文件的形式类似windows中的ini文件
在使用前需要先安装该模块,使用pip安装即可
2.configparser读取文件的基本方法
(1)新建一个config.ini文件,如下
(2)新建一个readconfig.py文件,读取配置文件的信息
import configparser cf = configparser.configparser() cf.read("e:\crawler\config.ini") # 读取配置文件,如果写文件的绝对路径,就可以不用os模块 secs = cf.sections() # 获取文件中所有的section(一个配置文件中可以有多个配置,如数据库相关的配置,邮箱相关的配置, 每个section由[]包裹,即[section]),并以列表的形式返回 print(secs) options = cf.options("mysql-database") # 获取某个section名为mysql-database所对应的键 print(options) items = cf.items("mysql-database") # 获取section名为mysql-database所对应的全部键值对 print(items) host = cf.get("mysql-database", "host") # 获取[mysql-database]中host对应的值 print(host)
上述代码运行结果如下,可以和config.ini进行对比
3.引入os模块,使用相对目录读取配置文件
工程目录如下:
readconfig.py:
import configparser import os root_dir = os.path.dirname(os.path.abspath('.')) # 获取当前文件所在目录的上一级目录,即项目所在目录e:\crawler cf = configparser.configparser() cf.read(root_dir+"/config.ini") # 拼接得到config.ini文件的路径,直接使用 secs = cf.sections() # 获取文件中所有的section(一个配置文件中可以有多个配置,如数据库相关的配置,邮箱相关的配置,每个section由[]包裹,即[section]),并以列表的形式返回 print(secs) options = cf.options("mysql-database") # 获取某个section名为mysql-database所对应的键 print(options) items = cf.items("mysql-database") # 获取section名为mysql-database所对应的全部键值对 print(items) host = cf.get("mysql-database", "host") # 获取[mysql-database]中host对应的值 print(host)
或者使用os.path.join()进行拼接
import configparser import os root_dir = os.path.dirname(os.path.abspath('.')) # 获取当前文件所在目录的上一级目录,即项目所在目录e:\crawler configpath = os.path.join(root_dir, "config.ini") cf = configparser.configparser() cf.read(configpath) # 读取配置文件 secs = cf.sections() # 获取文件中所有的section(一个配置文件中可以有多个配置,如数据库相关的配置,邮箱相关的配置,每个section由[]包裹,即[section]),并以列表的形式返回 print(secs) options = cf.options("mysql-database") # 获取某个section名为mysql-database所对应的键 print(options) items = cf.items("mysql-database") # 获取section名为mysql-database所对应的全部键值对 print(items) host = cf.get("mysql-database", "host") # 获取[mysql-database]中host对应的值 print(host)
4.通过读取配置文件
重新写一下之前的requests+正则表达式爬取猫眼电影的例子
把读取配置文件readconfig.py和操作数据库handledb.py分别封装到一个类中
readconfig.py如下
import configparser import os class readconfig: """定义一个读取配置文件的类""" def __init__(self, filepath=none): if filepath: configpath = filepath else: root_dir = os.path.dirname(os.path.abspath('.')) configpath = os.path.join(root_dir, "config.ini") self.cf = configparser.configparser() self.cf.read(configpath) def get_db(self, param): value = self.cf.get("mysql-database", param) return value if __name__ == '__main__': test = readconfig() t = test.get_db("host") print(t)
handledb.py如下
# coding: utf-8 # author: hmk from common.readconfig import readconfig import pymysql.cursors class handlemysql: def __init__(self): self.data = readconfig() def conn_mysql(self): """连接数据库""" host = self.data.get_db("host") user = self.data.get_db("user") password = self.data.get_db("password") db = self.data.get_db("db") charset = self.data.get_db("charset") self.conn = pymysql.connect(host=host, user=user, password=password, db=db, charset=charset) self.cur = self.conn.cursor() def execute_sql(self, sql, data): """执行操作数据的相关sql""" self.conn_mysql() self.cur.execute(sql, data) self.conn.commit() def search(self, sql): """执行查询sql""" self.conn_mysql() self.cur.execute(sql) return self.cur.fetchall() def close_mysql(self): """关闭数据库连接""" self.cur.close() self.conn.close() if __name__ == '__main__': test = handlemysql() sql = "select * from maoyan_movie" for i in test.search(sql): print(i)
最后的运行文件,调用前面的方法
# coding: utf-8 # author: hmk import requests import re from common import handledb class crawler: """定义一个爬虫类""" def __init__(self): self.db = handledb.handlemysql() @staticmethod def get_html(url, header): response = requests.get(url=url, headers=header) if response.status_code == 200: return response.text else: return none @staticmethod def get_data(html, list_data): pattern = re.compile(r'<dd>.*?<i.*?>(\d+)</i>.*?' # 匹配电影排名 r'<p class="name"><a.*?data-val=".*?">(.*?)' # 匹配电影名称 r'</a>.*?<p.*?class="releasetime">(.*?)</p>' # 匹配上映时间 r'.*?<i.*?"integer">(.*?)</i>' # 匹配分数的整数位 r'.*?<i.*?"fraction">(.*?)</i>.*?</dd>', re.s) # 匹配分数小数位 m = pattern.findall(html) for i in m: # 因为匹配到的所有结果会以列表形式返回,每部电影信息以元组形式保存,所以可以迭代处理每组电影信息 ranking = i[0] # 提取一组电影信息中的排名 movie = i[1] # 提取一组电影信息中的名称 release_time = i[2] # 提取一组电影信息中的上映时间 score = i[3] + i[4] # 提取一组电影信息中的分数,这里把分数的整数部分和小数部分拼在一起 list_data.append([ranking, movie, release_time, score]) # 每提取一组电影信息就放到一个列表中,同时追加到一个大列表里,这样最后得到的大列表就包含所有电影信息 def write_data(self, sql, data): self.db.conn_mysql() try: self.db.execute_sql(sql, data) print('导入成功') except: print('导入失败') self.db.close_mysql() def run_main(self): start_url = 'http://maoyan.com/board/4' depth = 10 # 爬取深度(翻页) header = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "accept-encoding": "gzip, deflate, sdch", "accept-language": "zh-cn,zh;q=0.8", "cache-control": "max-age=0", "connection": "keep-alive", "host": "maoyan.com", "referer": "http://maoyan.com/board", "upgrade-insecure-requests": "1", "user-agent": "mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/49.0.2623.75 safari/537.36"} for i in range(depth): url = start_url + '?offset=' + str(10 * i) html = self.get_html(url, header) list_data = [] self.get_data(html, list_data) for i in list_data: """这里的list_data参数是指正则匹配并处理后的列表数据(是一个大列表,包含所有电影信息,每个电影信息都存在各自的一个列表中; 对大列表进行迭代,提取每组电影信息,这样提取到的每组电影信息都是一个小列表,然后就可以把每组电影信息写入数据库了)""" movie = i # 每组电影信息,这里可以看做是准备插入数据库的每组电影数据 sql = "insert into maoyan_movie(ranking,movie,release_time,score) values(%s, %s, %s, %s)" # sql插入语句 self.write_data(sql, movie) if __name__ == '__main__': test = crawler() test.run_main()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
Python使用ConfigParser模块操作配置文件的方法
-
Python configparser的使用 读取配置文件
-
python的schedule定时任务模块二次封装方法
-
Python中读取config配置文件的方法
-
Python 中 configparser 配置文件的读写及封装,配置文件存放数据,方便修改
-
Python读取配置文件-ConfigParser的二次封装方法
-
Python configparser的使用 读取配置文件
-
Python实现读取Properties配置文件的方法
-
Python中读取config配置文件的方法
-
python的schedule定时任务模块二次封装方法