如何在使用os.listdir时删除.py扩展名

4

在我的代码中,我希望对目录中存在的所有文件执行导入文件名。我在工作区下有一个名为abc.py的文件。 目前我正在执行以下操作:

for filename in os.listdir(homedir/workspace)
    exec "import " + filename
    filename = eval(filename + '.function(variable)')

问题在于它使用了 import abc.py 而不是 import abc,然后显示错误信息 no module named py
我该如何解决这个问题呢?
提前感谢!

注意:应避免使用 exec。您可以通过 module = __import__(filename) 实现完全相同的效果。使用 exec 会打开一个安全问题(例如,某人可以将文件命名为 os;os.sytem("killall cats"),当您的代码执行时,所有猫都会死亡!使用 __import__ 您只会收到一个 ImportError。比 __import__ 更好的是 importlib.import_module,虽然它仅适用于 Python2.7 和 3.1+。 - Bakuriu
3个回答

8

您可以使用os.path.splitext

os.path.splitext(filename)[0]

返回的两个元素数组中,第一个元素只是文件名,第二个元素是扩展名。为了更加安全,您可以再次确认您确实获取了一个 .py 文件:

if os.path.splitext(filename)[1] == '.py':
    # do stuff

1

要在目录中运行所有Python文件的 .function(variable)

import os
import sys
from importlib import import_module

dirpath = 'homedir/workspace'
sys.path.append(dirpath)
for filename in os.listdir(path)
    module_name, ext = os.path.splitext(filename)
    if ext == '.py':
       try:
           result = import_module(module_name).function(variable)
       except Exception as e:
           sys.stderr.write('error: %s: %s\n' % (filename, e))
           continue
       else:
           print('%s: %s' % (filename, result))

另请参阅使用Python构建最小插件架构


0
你可以使用glob
import glob
import os
os.chdir("/mydir")
for file in glob.glob("*.py"):
    # do something with file

阅读此内容以确保您真正想要使用{{link1:exec}}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接