用python配置文件

时间:2018-08-07 02:49:23

标签: python python-3.x sqlite ini

我正在深入研究Python的世界,通过为我的dvd集合编写一个基于清单的简单应用程序作为练习来熟悉sqlite3的一种方法。

在我的项目中,我正在使用一个ini文件进行设置,然后从另一个文件中调用的共享库中读取该文件中的值。我很想反馈我的方法,尤其是对配置文件的使用以及有关该文件的最佳编码实践。

配置的格式如下,名为config.ini

sub_category_id|category_id
101            |1
102            |1
103            |1
201            |2

然后我的utils库的格式如下:

print(mlp.predict(scaler.transform(test_val)))

最后,我的测试查找功能是:

[main]
appversion = 0.1.0
datasource = data\database.db

我最大的问题是关于从utils.py内部建立数据连接的问题。首先,我正在读取文件,然后在同一脚本中形成表单,并从ini文件中的设置建立数据连接。然后由其他文件读取。这是我尝试模块化的方法,但是我不确定它是否正确。

谢谢。

1 个答案:

答案 0 :(得分:1)

要直接回答您的问题,您可以执行类似的操作来缓存对象,这样就不必在每次调用utils.py中的函数之一时都反复创建/打开它们:

import os
import sqlite3
from configparser import ConfigParser

CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'config/config.ini')
config = None
con = None

def get_settings(CONFIG_PATH):
    global config 
    if config is None:
        config = ConfigParser()
        config.read(CONFIG_PATH)
    return config


def db_connect():
    global con
    if con is None:
        config = get_settings()
        con = sqlite3.connect(config.get('main', 'datasource'))
    return con

尽管这可能会解决您的问题,但它在很大程度上依赖于全局变量,这可能会在其他地方引起问题。通常,在那儿您可以将类切换为属于您的代码部分的容器。例如:

import os
import sqlite3
from configparser import ConfigParser

class DVDApp:
    CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'config/config.ini')

    def __init__(self):
        self.config = ConfigParser()
        self.config.read(self.CONFIG_PATH)        
        self.con = sqlite3.connect(self.config.get('main', 'datasource'))        

    def asset_lookup(self):        
        cur = self.con.cursor()
        cur.execute("SELECT * FROM dvd")
        results = cur.fetchall()
        for row in results:
            print(row)

初始化self中保留的配置和连接对象将减少到仅3行代码。从而几乎不需要将代码拆分为多个文件。即使是这样,在模块之间共享DVDApp的一个实例就足够了,然后该模块将保存所有其他共享对象。