一直认为import库时,如果导入高层名称,那么其子功能一定能够使用,通过一个例子来说明我想表达的意思:
问题描述:中文分词,提出中文标点符号。
解题思路:确定有哪些中文标点符号,再提出?
有哪些标点符号?人为排除,不可避免会遗漏;能够使用第三方库?有:zhon。
import re import zhon import string line = "测试。。去除标点。。" print(string.punctuation) print(zhon.hanzi.punctuation) print(re.findall('[{}]'.format(zhon.hanzi.punctuation),'line'))
运行,结果出错:
C:\Users\cwl\AppData\Local\Programs\Python\Python37\python.exe D:/pycharm/PycharmProjects/python程序设计基础/文件/综合应用/批量查找文件中的内容/提取英文文本.py
Traceback (most recent call last):
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
File "D:/pycharm/PycharmProjects/python程序设计基础/文件/综合应用/批量查找文件中的内容/提取英文文本.py", line 8, in
print(zhon.hanzi.punctuation)
AttributeError: module 'zhon' has no attribute 'hanzi'
zhon库介绍如下:
Zhon is a Python library that provides constants commonly used in Chinese text processing:
使用命令行:pip zhon install后,安装的库文件如下所示:
发现问题的根源在于前期对python“库”概念理解不深入。经过分析总结到python库使用时会涉及到如下三个概念:
1、模块
模块是一种以.py为后缀的python文件,可以理解为普通编写好的python文件,要作为库文件使用,必须包含函数;模块名为该.py文件的名称。模块的名称作为一个全局变量__name__的取值,可以被其他模块获取或导入。
模块的导入通过ipmort来实现,导入模块的方式如下:import 特定模块名称
2、包
是在模块之上的概念,为了方便管理而将文件进行打包。包目录下第一个文件便是 __init__.py,然后是一些模块文件和子目录,假如子目录中也有 __init__.py,那么它就是这个包的子包了。包文件有一个很好的应用场景是:
A开发者编写了一个实现x功能的模块,命名为perfect;
B开发展编写了一个实现y功能的模块,命名为perfect;
C用户想使用y功能的模块,但是因命名相同,程序无法区分两个文件。为解决该问题,可以将同样名称的两个文件放置在不同包名的包中,通过包名和文件名结合使用来确定特定的模块。
包中特定模块的引用方式为:import 包名称.模块名称
3、库
Python中的库是借用其他编程语言的概念,没有特别具体的定义,Python库着重强调其功能性。在Python中,具有某些功能的模块和包都可以被称作库。模块有诸多函数组成,包由诸多模块机构化组成,库中也可以包含包、模块和函数。
所以:python中真正使用的是包和模块,库是抽象意义上的统称。
由此可见,zhon其实是一个包名,为此要使用某一个模块的功能,必须在导入模块名称是明确指明模块名称。为此,中文标点符号使用例子的代码应该修改为:
import zhon.hanzi import string line = "测试。。去除标点。。I love you!" print(string.punctuation) print(zhon.hanzi.punctuation)
运行结果:
C:\Users\cc\AppData\Local\Programs\Python\Python37\python.exe D:/pycharm/PycharmProjects/python程序设计基础/文件/综合应用/批量查找文件中的内容/提取英文文本.py
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、 、〃〈〉《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏﹑﹔·!?。。
Process finished with exit code 0