python文件命名陷阱
来源:互联网 发布:淘宝仓库打包员4000 编辑:程序博客网 时间:2024/05/02 05:02
最近在学习python,学习到xml部分,按照教程弄了代码,如下:
from xml.parsers.expat import ParserCreateclass DefaultSaxHandler(object): def start_element(self, name, attrs): print('sax:start_element: %s, attrs: %s' % (name, str(attrs))) def end_element(self, name): print('sax:end_element: %s' % name) def char_data(self, text): print('sax:char_data: %s' % text)xml = r'''<?xml version="1.0"?><ol> <li><a href="/python">Python</a></li> <li><a href="/ruby">Ruby</a></li></ol>'''handler = DefaultSaxHandler()parser = ParserCreate()parser.StartElementHandler = handler.start_elementparser.EndElementHandler = handler.end_elementparser.CharacterDataHandler = handler.char_dataparser.Parse(xml)
运行结果如下:
Traceback (most recent call last):
File "D:\workspace\python_test_project\test\xml.py", line 1, in <module>
from xml.parsers.expat import ParserCreate
File "D:\workspace\python_test_project\test\xml.py", line 1, in <module>
from xml.parsers.expat import ParserCreate
ImportError: No module named 'xml.parsers'; 'xml' is not a package
百思不得姐,怎么会有错了,网上一搜才知道是我自己的文件名命名为了xml导致,不过,为什么我自己的文件名命名为xml就会导致这个错误呢?这还得结合python查找module顺序来说,python查找module的顺序如下:
1. 首先判断这个module是不是built-in即内建模块,
如果是则引入内建模块,如果不是则在一个称为sys.path的list中寻找
2. sys.path在python脚本执行时动态生成,包括以下3个部分:
a.脚本执行的位置,即当前路径
b.环境变量中的PYTHONPATH, 即.bash_profile
c.安装python时的依赖位置
而这里的xml属于第三方库不属于内建模块,那么打印下我的sys.pyth看下:
['D:\\workspace\\python_test_project\\test'
'D:\\workspace\\python_test_project'
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32\\DLLs'
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32\\lib'
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32'
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32\\lib\\site-packages'
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python35-32\\python35.zip']
可以看到如上面所说,先找的是当前目录,当前目录的文件名我又命名为了xml,所以python解释器会试图从当前的xml.py文件去找xml.parsers.expat,那当然是找不到的了,那么我系统的parsers.expat在哪里呢?找了下路径如下:
%PYTHONPATH%\Lib\xml\parsers
现在我想你知道为什么命名为xml又在里面用到xml模块会报错了。
那么你会说,既然你说当引入非内建的第三方模块时,由于python引入module顺序的原因,文件名不能和使用的第三方模块名一致,那么使用内建模块文件名和内建模块名会报错吗?
就上面的代码添加sys内建模块的引入,然后打印sys.path 将文件名命名为sys:
然后运行下,我们可以看到没任何问题,这就验证了我们上面的说法,当在代码中使用第三方module时,文件名不能和module文一样,在使用内建module的时候没这个限制,有不对的地方欢迎指正。
- python文件命名陷阱
- Python 文件命名陷阱:importError import socket
- python批量命名文件
- python 复制并重命名文件
- python文件命名小脚本
- ios 命名的陷阱
- javascript中命名陷阱
- python陷阱
- Python陷阱
- 【Python】删除重复文件 并重命名
- 【Python】遍历文件夹,并命名文件
- python导入中文命名的文件
- Python组元陷阱
- Python小陷阱
- python中函数陷阱
- python的陷阱1
- Python陷阱汇总
- Python作用域陷阱
- js前端特殊字符处理
- OGNL表达式的基本
- Ubuntu 14.04安装JDK1.8.0_25与配置环境变量
- touch事件与点击事件的冲突
- 解决保存图片文件名冲突-2(仅供备份)
- python文件命名陷阱
- LeetCode 37 SudoKu Solver
- 流程图的基础(笔记)
- 解决java compiler level does not match the version of the installed java project facet
- fedora 搜狗输入法安装
- SharedPrefences putStringSet 问题
- 用JavaScript判断颜色时候的一个细节
- opencl/msvc:kernel因为指针对齐方式(alignment)造成向量类型(vector data type)读写异常
- 通用项目