如何在Python包中嵌入文本文件并正确访问它?

时间:2018-02-21 11:03:16

标签: python python-3.x resources packages embedded-resource

我想在我的Python 3.6包的子包中包含一个文本资源文件(用于存储复杂的SQL请求代码)并在运行时读取它(作为字符串,字符串集合或文件,无论如何) 。怎么可能这样做?

1 个答案:

答案 0 :(得分:1)

为什么要将它存储在代码之外? Python有多行字符串,所以如果它只是一个可读性的问题,你不需要一个独特的文本文件:

# mydbcode.py

# not really complex actually but you get the point...    
complex_query = """
SELECT   GROUPS.PGROUP, SUM(P.AMOUNT)
FROM     PENALTIES AS P,
        (SELECT 1 AS PGROUP, '1980-01-01' AS START,
                '1981-06-30' AS END
         UNION
         SELECT 2, '1981-07-01', '1982-12-31'
         UNION
         SELECT 3, '1983-01-01', '1984-12-31') AS GROUPS
WHERE    P.PAYMENT_DATE BETWEEN START AND END
GROUP BY GROUPS.PGROUP
ORDER BY 1
"""

现在,如果确实希望将它放在使用它的包中的.sql文件中,那么只需找到文件并阅读它即可。这里唯一的“难点”是找到文件,但您可以使用__file__魔术变量和os.path函数来获取它:

# mydbcode.py
import os
_HERE = os.path.dirname(os.path.abspath(__file__))
_SQLFILE = os.path.join(_HERE, "myquery.sql")

def read_query():
    with open(_SQLFILE) as f:
        return f.read().strip()