我在目录中有大约50个Python文件,所有文件都按顺序命名,例如:myfile1
,myfile2
..... myfile50
。现在,我想在另一个Python文件中导入这些文件的内容。这就是我试过的:
i = 0
while i < 51:
file_name = 'myfile' + i
import file_name
i += 1
但是,我收到以下错误:
ImportError: No module named file_name
如何将所有这些按顺序命名的文件导入到另一个Python文件中,而不必单独为每个文件写入导入?
答案 0 :(得分:4)
您无法使用import
从包含其名称的字符串中导入模块。但是,您可以使用importlib
:
导入importlib
i = 0
while i < 51:
file_name = 'myfile' + str(i)
importlib.import_module(file_name)
i += 1
另外,请注意&#34; pythonic&#34;迭代一定次数的方法是使用for
循环:
for i in range(0, 51):
file_name = 'myfile' + str(i)
importlib.import_module(file_name)
答案 1 :(得分:3)
other answer by @Mureinik很好,但仅仅做 - importlib.import_module(file_name)
是不够的。正如the documentation of importlib
-
<强>
importlib.import_module(name, package=None)
强>导入模块。 name参数指定以绝对或相对术语导入的模块(例如pkg.mod或..mod)。如果名称是以相对术语指定的,那么必须将package参数指定给作为解析包名称的锚点的包(例如import_module('.. mod','pkg.subpkg')将导入pkg的.mod)。 指定的模块将插入到sys.modules中并返回。
importlib.import_module
只返回模块对象,它不会将其插入globals
命名空间,因此即使您以这种方式导入模块,也不能在以后将该模块直接用作{{1} (或左右)。
示例 -
filename1.<something>
为了能够通过指定名称来使用它,您需要将返回的模块添加到>>> import importlib
>>> importlib.import_module('a')
<module 'a' from '/path/to/a.py'>
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
字典(这是全局命名空间的字典)中。示例 -
globals()
除了gbl = globals()
for i in range(0, 51):
file_name = 'myfile{}'.format(i)
try:
gbl[file_name] = importlib.import_module(file_name)
except ImportError:
pass #Or handle the error when `file_name` module does not exist.
以外,ImportError
模块不存在也可能更好,你可以随意处理它们。
答案 2 :(得分:2)
glob
函数代替硬编码for
周期。这是迭代文件的 pythonic 方式。
# It's code from Anand S Kumar's solution
gbl = globals()
def force_import(module_name):
try:
gbl[module_name] = importlib.import_module(module_name)
except ImportError:
pass #Or handle the error when `module_name` module does not exist.
# Pythonic way to iterate files
import glob
for module_name in glob.glob("myfile*"):
force_import( module_name.replace(".py", "") )