[英]Importing multiple files named sequentially in Python
我在目录中有大约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文件中导入所有这些顺序命名的文件,而不必单独为每个文件写入导入?
您不能使用import
从包含其名称的字符串导入模块。 但是,您可以使用importlib
:
import importlib
i = 0
while i < 51:
file_name = 'myfile' + str(i)
importlib.import_module(file_name)
i += 1
另外,请注意迭代设定次数的“pythonic”方式是使用for
循环:
for i in range(0, 51):
file_name = 'myfile' + str(i)
importlib.import_module(file_name)
@Mureinik的另一个答案是好的,但只是做 - importlib.import_module(file_name)
是不够的。 正如importlib
的文档中所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
命名空间中,因此即使以这种方式导入模块,也不能在以后将该模块直接用作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
incase file_name
模块不存在之外,它也可能更好,您可以随意处理它们。
@Murenik和@Anand小号库马尔已经给了一个正确的答案,但我只是想帮助有点太:)如果你想从某个文件夹导入所有的文件,最好使用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", "") )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.