繁体   English   中英

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

[英]Importing multiple files named sequentially in Python

我在目录中有大约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文件中导入所有这些顺序命名的文件,而不必单独为每个文件写入导入?

您不能使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM