从加载机制上看其实python解释器可以加载任何内容,只要定义好相应的finder和loader即可.这种扩展方式叫做import hook
,官方其实也提供了几个import hook
来实现一些特殊需求.本文将介绍这个
就和C/C++中一些常量数据甚至文件内容直接写在头文件中可以加快运行时的速度一样,在python的导入时直接将需要的数据导入其实也是一种提高运行时效率的方法.
python中有标准库pkgutil.get_data(package,path)
,可以帮我们实现这个需求.
我们有一个html文件叫"base.html"这边我们使用pkgutil
来加载它
-
将其放入一个模块内 我们将其放入一个叫data_demo的模块中
data_demo-| |-__init__.py |-base.html
-
使用pkgutil.get_data加载数据
import pkgutil
template = pkgutil.get_data('data_demo', 'base.html')
print(template.decode('utf-8'))
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html> <head>
<title>PyMOTW Template</title>
</head>
<body>
<h1>Example Template</h1>
<p>This is a sample data file.</p>
</body>
</html>
python默认就可以加载zip包中的模块.这也就为大文件的导入提供了方便.
我们将data_demo
文件中的文件打包到zip归档中
zipdata_demo.zip--|
|-data_demo-|
|-__init__.py
|-base.html
然后还是使用pkgutil
来读取数据,注意需要先将zipdata_demo.zip
加入模块可以访问的位置
import pkgutil
import sys
sys.path.insert(0, 'zipdata_demo.zip')
import data_demo
emplate = pkgutil.get_data('data_demo', 'base.html')
print(emplate.decode('utf-8'))
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html> <head>
<title>PyMOTW Template</title>
</head>
<body>
<h1>Example Template</h1>
<p>This is a sample data file.</p>
</body>
</html>
上面的例子我们可以看到python自带加载zip中模块的能力,但每次加载都要显式的写上代码这样相当的不优雅
import sys
sys.path.insert(0, 'xxxx.zip')
python提供了标准库zipimport
来解决这个问题
import zipimport
importer = zipimport.zipimporter('zipdata_demo.zip')
module = importer.load_module('data_demo')
module.__path__
['zipdata_demo.zip/data_demo']
import pkgutil
emplate = pkgutil.get_data('data_demo', 'base.html')
print(emplate.decode('utf-8'))
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html> <head>
<title>PyMOTW Template</title>
</head>
<body>
<h1>Example Template</h1>
<p>This is a sample data file.</p>
</body>
</html>