模块与包的使用

目录

一、名字的查找顺序

1、方法

 2、遇到模块找不到的情况

 二、绝对导入和相对导入

1、绝对导入

2、相对导入

三、包的使用

1、什么是包

2、包和模块有什么区别

四、软件开发目录规范

1、定义

2、目录结构

五、正则表达式

定义

1、字符组

2、字符

3、量词

4、贪婪匹配

5、转义符 \ 

6、re模块下的常用方法

7、分组

(1)、无名分组

(2)、有名分组

(3)、案例


一、名字的查找顺序

1、方法

1. 先从内存中查找
2. 再从内置模块中查找
3. 最后去环境变量sys.path中查找

如果以上都找不到,直接报错!

注:给文件名或者叫模块名起名字的时候一定不能跟内置模块名冲突!

import sys
print(sys.path)

['D:\\Python27\\day20', 'D:\\Python27\\day20', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 'D:\\Python38\\python38.zip', 'D:\\Python38\\DLLs', 'D:\\Python38\\lib', 'D:\\Python38', 'C:\\Users\\oldboy\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Python38\\lib\\site-packages', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']

 上面的列表中第一个元素永远是当前文件所在的路径,第二个是项目的路径。

 2、遇到模块找不到的情况

(1).把模块所在的路径添加到sys.path中

import sys
sys.path.append(r'D:\Python27\day20\aaa\bbb')

(2).使用from...import句式

from aaa.bbb.ccc import m1
from aaa.bbb.ccc.m1 import f1

f1()
m1.f1()

 二、绝对导入和相对导入

在导入模块的时候,模块的查找始终以执行文件所在的路径为准。

1、绝对导入

它始终是以执行文件所在的sys.path路径为基准查找

2、相对导入

.(句点符)
. 代表的是当前路径
.. 代表的是上一级路径

注:

相对导入可以打破始终以执行文件及准的查找顺序

只要py文件中出现了相对导入语句(.开头的语句),那么,这个文件就不能当成执行文件了,只能被导入。

from .ccc import m2
from .ccc.ddd import m2

三、包的使用

1、什么是包

包其实就是文件夹中包含了一些列的py文件(模块),即包就是一些列模块的组合。

2、包和模块有什么区别

包中有一个特殊文件:__init__.py文件

导包其实就是在导包下的__init__.py文件的!

后续我们可能会在项目中封装出各种各样的包,一个包一般情况就是一个答得功能,而且包中使用的代码、路径等都不相互依赖。

四、软件开发目录规范

1、定义

为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要。软件的目录规范并无硬性标准,只要清晰可读即可。简单来说,软件开发目录规范就是跟项目中的文件夹起合适的名字。

2、目录结构

(1).bin:放启动文件的

eg:run.py start.py manage.py...

如果你的启动文件只有一个,也可以不要bin文件夹,可以把启动文件写在项目的根下。

 (2).conf/ (config:配置) 

settings.py

就是一些初始化的数据。

(3).core/(核心)

写一些项目的核心逻辑。

src.py 
def login():
    pass
def register():
    pass

(4).lib/ (library:库)

这个里面一般写项目使用的公共代码。

common.py
def outer():
    pass

(5).log:日志

日志:就是记录一些在代码运行过程中发生的一些事情,可以是正确的,可以是异常的。

(6).db/(database)

跟项目相关的数据存储都存在db(data)。

(7).api/

存放接口文件,接口主要用于为业务逻辑提供数据操作。

当你自定义文件夹名字的时候,一定要是见名知意, 一定不能出现中文的。

(8).run.py

程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹作为sys.path的第一个路径,这样就省去了处理环境变量的步骤。

(9).setup.py

安装、部署、打包的脚本

(10).requirements.txt

存放软件依赖的外部Python包列表

(11).README

就是项目的说明书

五、正则表达式

定义

正则表达式:利用一些特殊的符号匹配出我们想要的数据。

正则表达式它是一门独立的语言,跟Python、Java等语言没有关系的。所以,如果想在Python中使用正则表达式,需要借助于re模块(import re)。 

我们只学习正则的基础,就学习一些简单的正则够我们开发使用就行了。

# 判断手机号是否合法
# 1. 手机号需要是纯数字
# 2. 手机号必须是11位
# 3. 必须是13、15、16、18等开头

import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
        print('是合法的手机号码')
else:
        print('不是合法的手机号码')

1、字符组

字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。 假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。

正则

待匹配字符

匹配

结果

说明

[0123456789]

8

True

在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配

[0123456789]

a

False

由于字符组中没有"a"字符,所以不能匹配

[0-9]

7

True

也可以用-表示范围,[0-9]就和[0123456789]是一个意思

[a-z]

s

True

同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示

[A-Z]

B

True

[A-Z]就表示所有的大写字母

[0-9a-fA-F]

e

True

可以匹配数字,大小写形式的a~f,用来验证十六进制字符

2、字符

元字符

匹配内容

.

匹配除换行符以外的任意字符

\w

匹配字母或数字或下划线

\s

匹配任意的空白符

\d

匹配数字

\n

匹配一个换行符

\t

匹配一个制表符

\b

匹配一个单词的结尾

^

匹配字符串的开始

$

匹配字符串的结尾

\W

匹配非字母或数字或下划线

\D

匹配非数字

\S

匹配非空白符

a|b

匹配字符a或字符b

()

匹配括号内的表达式,也表示一个组

[...]

匹配字符组中的字符

[^...]

匹配除了字符组中字符的所有字符

3、量词

1. 量词只能够影响前面一个字符(ab+ 影响b)
2. 量词不能够单独使用,必须配合表达式使用

量词

用法说明

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n到m次

4、贪婪匹配

贪婪匹配:贪婪匹配就是把匹配的内容尽量多的匹配!

正则

待匹配字符

匹配
结果

说明

<.*>

<script>...<script>

<script>...<script>

默认为贪婪匹配模式,会匹配尽量长的字符串

<.*?>

r'\d'

<script>
<script>

加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

取消贪婪匹配

<.*?>

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
合在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x

就是取前面任意长度的字符,直到一个x出现

练习

1. 手机号正则 : /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/

2. 身份证的正则:"^[1-9]\\d{5}(19\\d{2})|(20[01]\\d)|(202[012])(((0[13578])|10|12)((0[1-9])|(([12][0-9])|30|31)))|(((0[469])|11)((0[1-9])|(([12][0-9])|30)))|(02((0[1-9])|([12][0-9])))//d{4}"

3. 邮箱的正则:^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$
...

对于常见的正则表达式,我们直接取百度搜索,实际编码中,我们可以写一些简单的正则。 

5、转义符 \ 

在原生正则中,取消转义字符只需要加\(一个\只能转一个字符),在Python中,推荐使用r'\n\t\d'(取消转义)

正则

待匹配字符

匹配
结果

说明

\n

\n

False

因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配

\\n

\n

True

转义\之后变成\\,即可匹配

"\\\\n"

'\\n'

True

如果在python中,字符串中的'\'也需要转义,所以每一个字符串'\'又需要转义一次

r'\\n'

r'\n'

True

在字符串之前加r,让整个字符串不转义

6、re模块下的常用方法

在Python中,如果使用正则,需要借助于模块,re模块

regluar express -------------> re
import re

ret = ret = re.findall('正则', '待匹配内容') # 返回所有满足匹配条件的结果,放在列表里
"""待匹配内容一定是一个字符串,文本. []"""
ret = re.findall('ab', 'eva egon yuan a')
   # 返回所有满足匹配条件的结果,放在列表里
"""如果匹配到内容就把数据以列表的形式返回, 如果匹配不到就返回[]"""
print(ret)  # []

ret = re.search('a', 'eva egon yuan').group()
print(ret) # 结果 : 'a'
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
if ret:
	print(ret.group())
else:
	print(ret)
try:
	ret = re.search('a', 'eva egon yuan').group()
	print(ret)
except Exception:
	print(ret)

ret = re.match('a', 'ewqeqwabc').group()  # 同search,不过尽在字符串开始处进行匹配
print(ret)
# 结果 : 'a'
try:
    ret = re.match('a', 'ewqeqwabc').group()
    print(ret)
except Exception:
    print(ret)

7、分组

(1)、无名分组

使用小括号括起来的正则表达式就是无名分组

import re

res = re.search('^([1-9])(\d{14})(\d{2}[0-9x]?)$', '110105199812067023')
print(res)  # <re.Match object; span=(0, 18), match='110105199812067023'>
print(res.group())   # 110105199812067023
print(res.group(2))  # 10105199812067
print(res.group(3))  # 023
"""
如果是findall,分组优先展示,无名分组
"""
res = re.findall("^[1-9]\d{14}(\d{2}[0-9x]?$)", '110105199812067023')
print(res)  # ['023']
(2)、有名分组

使用小括号括起来的正则表达式然后给起个名字就是有名的

import re
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$', '110105199812067023')
print(res)  # <re.Match object; span=(0, 18), match='110105199812067023'>
print(res.group(1))  # 10105199812067
print(res.group(2))  # 023
print(res.group('xxx'))  # 10105199812067
print(res.group('ooo'))  # 023
(3)、案例

爬取红牛分公司官网数据

with open('a.txt', 'r', encoding='utf-8') as f:
	data = f.read()

import re

title_list = re.findall('<h2>(.*?)</h2>', data)
address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)

res_list = zip(title_list, address_list, email_list, phone_list)
# print(list(res_list))

for i in list(res_list):
	print("""
        公司名称:%s,
        公司地址:%s,
        公司邮编:%s,
        公司电话:%s,
    """ % (i[0], i[1], i[2], i[3]))

运行结果

        公司名称:红牛杭州分公司,
        公司地址:杭州市上城区庆春路29号远洋大厦11楼A座,
        公司邮编:310009,
        公司电话:0571-87045279/7792,
    

        公司名称:红牛广西分公司,
        公司地址:南宁市金湖路59号地王国际商会中心50层D1、E1室,
        公司邮编:530021,
        公司电话:0771-5592660/61/62,
    

        公司名称:红牛广州分公司,
        公司地址:广东省广州市天河珠江新城华夏路10号富力中心写字楼1904房,
        公司邮编:510623,
        公司电话:020-38927681,
    

        公司名称:红牛深圳分公司,
        公司地址:广东省深圳市福田区福华三路88号财富大厦39楼BCD,
        公司邮编:518048,
        公司电话:0755-23962001,
    

        公司名称:红牛湖南分公司,
        公司地址:湖南省长沙市天心区劳动西路289号嘉盛国际广场1626室,
        公司邮编:410015,
        公司电话:0731-88708080/8081,
    

        公司名称:红牛福建分公司,
        公司地址:福建省福州市台江区广达路68号金源广场东区15楼BC,
        公司邮编:350005,
        公司电话:0591-83362015,
    

        公司名称:红牛东莞分公司,
        公司地址:东莞市南城区石竹路3号广发金融大厦10楼01室,
        公司邮编:523071,
        公司电话:0769-23184981,
    

        公司名称:红牛四川分公司,
        公司地址:四川省成都市武侯区人民南路4段27号商鼎国际1栋1单元1201室,
        公司邮编:610041,
        公司电话:028-85226292,
    

        公司名称:红牛湖北分公司,
        公司地址:武汉市东西湖区金银湖路18号财富大厦13楼,
        公司邮编:430048,
        公司电话:027-63370775/63370772,
    

        公司名称:红牛云南分公司,
        公司地址:云南省昆明市青年路389号志远大厦13楼A-2号,
        公司邮编:650021,
        公司电话:0871-3100721,
    

        公司名称:红牛贵州分公司,
        公司地址:贵阳市云岩区北京路27号鑫都财富大厦26楼A座,
        公司邮编:550004,
        公司电话:0851—6814108,
    

        公司名称:红牛湛江分公司,
        公司地址:湛江市霞山区人民大道南45号民大商贸大厦1103,
        公司邮编:524000,
        公司电话:0759-2837830/2837860,
    

        公司名称:红牛南疆分公司,
        公司地址:新疆库尔勒市滨河路天赐花园B座2302室,
        公司邮编:841000,
        公司电话:0996-2106316,
    

        公司名称:红牛江西分公司,
        公司地址:江西省南昌市广场南路333号恒茂国际中心A座805室,
        公司邮编:330002,
        公司电话:0791-86497863/86665007,
    

        公司名称:红牛南京分公司,
        公司地址:江苏省南京市鼓楼区山西路8号金山大厦A座19楼1901室,
        公司邮编:210009,
        公司电话:025-83223948,
    

        公司名称:红牛北京分公司,
        公司地址:北京市建国门外大街永安东里华彬国际大厦10层1007,
        公司邮编:100022,
        公司电话:010-85288029-8010,
    

        公司名称:红牛辽宁分公司,
        公司地址:沈阳市和平区和平北大街69号总统大厦C座2206,
        公司邮编:110001,
        公司电话:024-23267261/62/63,
    

        公司名称:红牛陕西分公司,
        公司地址:陕西省西安市锦业路1号都市之门C座11508室,
        公司邮编:710065,
        公司电话:029-88816813,
    

        公司名称:红牛苏北分公司,
        公司地址:盐城市盐都区华邦国际西厦A区2006、2007,
        公司邮编:224000,
        公司电话:0515-88582102,
    

        公司名称:红牛汕头分公司,
        公司地址:广东省汕头市华山路碧霞庄中区1幢(民生银行大厦)407-408室,
        公司邮编:515041,
        公司电话:0754-88695688,
    

        公司名称:红牛重庆分公司,
        公司地址:重庆市渝中区华盛路1号企业天地8号楼第20层6+7单元,
        公司邮编:400015,
        公司电话:023-89031120/21,
    

        公司名称:红牛上海分公司,
        公司地址:上海市虹口区武进路360号壹丰广场1506室,
        公司邮编:200080,
        公司电话:021-61178178,
    

        公司名称:红牛新疆分公司,
        公司地址:新疆乌鲁木齐市北京南路439号中核发展大厦16楼,
        公司邮编:830011,
        公司电话:0991-4835894,
    

        公司名称:红牛安徽分公司,
        公司地址:安徽省合肥市肥西路66号汇金大厦12B楼1203-1205室,
        公司邮编:230001,
        公司电话:0551-2657611,
    

        公司名称:红牛黑龙江分公司,
        公司地址:黑龙江省哈尔滨市南岗区东大直街146号上和置和广场1号楼27层2711室,
        公司邮编:150001,
        公司电话:0451-53608457,
    

        公司名称:红牛河南分公司,
        公司地址:河南省郑州市中州大道1188号建业置地广场B座27层155号,
        公司邮编:450000,
        公司电话:0371-65786101,
    

        公司名称:红牛山东分公司,
        公司地址:山东省济南市经十路13777号中润世纪城5号楼902室,
        公司邮编:250014,
        公司电话:0531-88558011,
    

        公司名称:红牛甘肃分公司,
        公司地址:兰州市庆阳路105号澳兰名门B1座6楼,
        公司邮编:730000,
        公司电话:0931-8279900/0931-8276600 ,
    

        公司名称:红牛海南分公司,
        公司地址:海南省海口市国贸大道2号海南时代广场10楼10D单元,
        公司邮编:570125,
        公司电话:0898-68554263,
    

        公司名称:红牛青岛分公司,
        公司地址:山东省青岛市市北区延吉路76号中海大厦6号楼903室,
        公司邮编:266000,
        公司电话:0532-66990781,
    

        公司名称:红牛天津分公司,
        公司地址:天津市河西区越秀路38号银河大厦1004室,
        公司邮编:300201,
        公司电话:022-58376301/02,
    

        公司名称:红牛豫南分公司,
        公司地址:驻马店市乐山路与通达路交叉口爱家会展国际公寓5B1105,
        公司邮编:463000,
        公司电话:0396-3336611,
    

        公司名称:红牛山西分公司,
        公司地址:太原市杏花岭区肖墙路9号御花园假日广场写字楼B座11层8-16号,
        公司邮编:030002,
        公司电话:0351-3343385,
    

        公司名称:红牛吉林分公司,
        公司地址:吉林省长春市朝阳区人民大街4111号兆丰国际大厦402室,
        公司邮编:130000,
        公司电话:0431-88658765/89819146/88405122,
    

        公司名称:红牛内蒙分公司,
        公司地址:呼和浩特市赛罕区呼伦南路119号东达城市广场写字楼2307室,
        公司邮编:010020,
        公司电话:0471-5254961/62/63,
    

        公司名称:红牛河北分公司,
        公司地址:河北省石家庄市建设南大街6号西美大厦1102室,
        公司邮编:500000,
        公司电话:0311-86966921,
    

        公司名称:红牛青海分公司,
        公司地址:青海省西宁市城中区西大街10号浩运大厦7楼703室,
        公司邮编:810000,
        公司电话:0971-8276755,
    

        公司名称:红牛宁夏分公司,
        公司地址:银川市金凤区北京中路51号瑞银财富中心C座11楼,
        公司邮编:750001,
        公司电话:0951-6890560,
    

        公司名称:红牛浙南代表处,
        公司地址:温州市车站大道2号华盟商务广场1706-1707室,
        公司邮编:325000,
        公司电话:0577-88557337,
    

        公司名称:红牛金丽衢代表处,
        公司地址:金华市八一北街739号东方国际财富双塔西塔24楼F室,
        公司邮编:321000,
        公司电话:0579-82515088,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值