如何从Python中的不同文件夹导入所有文件

Mon*_*all 3 python python-import importerror

__init__.py在目录中,我能够将其导入

from subdirectory.file import *
Run Code Online (Sandbox Code Playgroud)

但我希望导入该子目录中的每个文件;所以我试过了

from subdirectory.* import *
Run Code Online (Sandbox Code Playgroud)

这不起作用。有什么建议?

a_g*_*est 5

如果您有以下结构:

$ tree subdirectory/
subdirectory/
??? file1.py
??? file2.py
??? file3.py
Run Code Online (Sandbox Code Playgroud)

并且您希望程序自动选取位于其中的每个模块subdirectory并以某种方式对其进行处理,您可以按如下方式实现:

import glob

# Get file paths of all modules.
modules = glob.glob('subdirectory/*.py')

# Dynamically load those modules here.
Run Code Online (Sandbox Code Playgroud)

有关如何动态加载模块,请参阅此问题


在你的subdirectory/__init__.py,你可以通过导入所有本地模块:

from . import file1
from . import file2
# And so on.
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式导入本地模块的内容

from .file1 import *
# And so on.
Run Code Online (Sandbox Code Playgroud)

然后您可以通过以下方式导入这些模块(或内容)

from subdirectory import *
Run Code Online (Sandbox Code Playgroud)

使用该属性__all____init__.py您可以控制在from ... import *语句期间将准确导入的内容。因此,如果您不想file2.py被导入,例如您可以这样做:

__all__ = ['file1', 'file3', ...]
Run Code Online (Sandbox Code Playgroud)

您可以通过访问这些模块

import subdirectory
from subdirectory import *

for name in subdirectory.__all__:
    module = locals()[name]
Run Code Online (Sandbox Code Playgroud)


小智 5

在尝试了一些不同的解决方案后找到了这个方法(如果相邻目录中有一个名为“folder”的文件夹):

for entry in os.scandir('folder'):
    if entry.is_file():
        string = f'from folder import {entry.name}'[:-3]
        exec (string)
Run Code Online (Sandbox Code Playgroud)