python库、包及模块的关系

一直认为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):
!"#$%&'()*+,-./:;<=>[email protected][\]^_`{|}~
  File "D:/pycharm/PycharmProjects/python程序设计基础/文件/综合应用/批量查找文件中的内容/提取英文文本.py", line 8, in <module>
    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:

  • CJK characters and radicals
  • Chinese punctuation marks
  • Chinese sentence regular expression pattern
  • Pinyin vowels, consonants, lowercase, uppercase, and punctuation
  • Pinyin syllable, word, and sentence regular expression patterns
  • Zhuyin characters and marks
  • Zhuyin syllable regular expression pattern
  • CC-CEDICT characters

使用命令行:pip zhon install后,安装的库文件如下所示:

python库、包及模块的关系

发现问题的根源在于前期对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
!"#$%&'()*+,-./:;<=>[email protected][\]^_`{|}~
"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、 、〃〈〉《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏﹑﹔·!?。。

Process finished with exit code 0