导入在Python中按顺序命名的多个文件

时间:2015-10-11 06:20:07

标签: python python-2.7 python-import

我在目录中有大约50个Python文件,所有文件都按顺序命名,例如:myfile1myfile2 ..... myfile50。现在,我想在另一个Python文件中导入这些文件的内容。这就是我试过的:

i = 0
while i < 51:
    file_name = 'myfile' + i
    import file_name
    i += 1

但是,我收到以下错误:

ImportError: No module named file_name

如何将所有这些按顺序命名的文件导入到另一个Python文件中,而不必单独为每个文件写入导入?

3 个答案:

答案 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)

@Murenik和@Anand S Kumar已经给出了正确答案,但我只想帮助一点:)如果你想从某个文件夹中导入所有文件,最好使用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", "") )