使用from openpyxl import *报错NameError,为何无法完整导入模块?
为啥用
from openpyxl import *没法直接用openpyxl.load_workbook? 咱们先拆解下问题的根源,其实是Python导入机制的特性导致的:
1. from xxx import *不会导入模块本身
这种导入方式的作用是把目标模块里的指定成员(要么是模块__all__列表里列出来的,要么是所有不带下划线前缀的公开名称)直接拉到当前脚本的命名空间里,但它不会把openpyxl这个模块对象本身导入进来。
所以你在第二个代码里写openpyxl.load_workbook时,Python会一脸懵:“我根本不知道openpyxl这个名字是啥啊”——这就是NameError的由来。正确的用法应该是直接写load_workbook(前提是它被包含在openpyxl顶层模块的可导入成员里)。
2. 子模块的内容不会被自动导入
另外你代码里的get_column_letter也会出问题,因为它根本不在openpyxl的顶层模块里,而是藏在openpyxl.utils这个子模块中。from openpyxl import *只会处理顶层模块的内容,不会自动帮你导入所有子模块的成员,所以就算你解决了load_workbook的问题,get_column_letter照样会报错。
给你两个可行的修正方案
方案一:按需显式导入(适合只用到少量成员的场景)
直接把需要的成员从对应模块里导进来,不用*:
from openpyxl import load_workbook from openpyxl.utils import get_column_letter import os os.chdir('c:\\users\\shivam\\Desktop') wb = load_workbook('data.xlsx') # 直接用函数名,不用加模块前缀 print(wb.sheetnames) print(get_column_letter(27))
方案二:保留模块命名空间(更推荐)
这种方式代码可读性更高,也不容易出现命名冲突,是Python社区的常规做法:
import openpyxl from openpyxl.utils import get_column_letter import os os.chdir('c:\\users\\shivam\\Desktop') wb = openpyxl.load_workbook('data.xlsx') print(wb.sheetnames) print(get_column_letter(27))
最后提一句:尽量别用from xxx import *
这种写法虽然省事儿,但坏处不少:
- 容易引发命名冲突:比如两个模块都有同名函数,后导入的会直接覆盖先导入的,排查起来特别麻烦;
- 代码可读性差:别人看你的代码时,根本不知道某个函数是从哪个模块来的,维护成本很高。
内容的提问来源于stack exchange,提问作者Shivam




