当项目越来越大,模块文件里功能越来越多,这时候把功能全部写在一个模块里就不是很好维护了,于是就有了包的概念,将功能分不同的文件和放在不同的包中,每个包里面存在一个__init__文件,用于导入本层包内所有模块

包是模块一的一种形式,本质上就是一个含有.py的文件夹

导入包 发生了三件事情

  1. 创建一个包的名称空间
  2. 指向包下面的py文件,将执行产生的名字放于包名称空间中,即包名称空间中存放的名字都是来自于py文件中
  3. 在当前执行文件中拿到一个包名 指向包的名称空间
  1. # 导入包就相当于导入包内的__init__文件,执行的时候以执行文件路径为搜索路径
  2. # 对于用户来说 导入包不能改变调用方式
  3. import aaa
  4. aaa.m2()
  5. aaa.m3()

导入包内包

导入包内包的话 要在第一层包__init__文件里面导入第二层包的模块和方法,这样最外面执行文件可以不用改变调用方式

相对导入和绝对导入


  1. # 绝对导入
  2. from aaa.m1 import m1
  3. from aaa.m2 import m2
  4. from aaa.bbb import m3
  5. from aaa.bbb import m4
  6. # 相对导入
  7. from .m1 import m1
  8. from .m2 import m2
  9. from .bbb import m3
  10. from .bbb import m4
  11. # .代表当前被导入文件所在的文件夹
  12. # ..代表当前被导入文件所在的文件夹的上一级
  13. # ...代表当前被导入文件所在的文件夹的上一级的上一级
  14. # 相对导入
  15. # 导入包内包的话 也要在第一层包__init__文件里面导入第二层包的方法,这样,最外面执行文件可以不用改变调用方式导入
  16. from ..bbb.m3 import m3
  17. from ..bbb.m4 import m4

注意事项

  1. 包内的所有文件都是被导入使用,而不是被直接运行的。
  2. 包内部模块之间的导入可以使用绝对导入与相对导入,使用相对导入更好一点。
  3. 只有在文件被当做模块导入时才能使用相对导入的方法
  4. 凡是在导入时是相对导入时,.的左边必须是一个包

time模块

time模块 主要提欧共了三种不同类型的时间,三种不同类型可以相互转换

方法 描述
time.time() 时间戳形式
time.strftime('%Y-%m-%d %X') 最常用 格式化为 2019-09-27 22:53:19
time.localtime() 结构化时间
  1. import time
  2. # 时间戳形式
  3. print(time.time())
  4. # 格式化时间
  5. print(time.strftime('%Y-%m-%d %X'))
  6. # 结构化时间
  7. print(time.localtime())
  8. # 结构化时间 --》 格式化时间
  9. struct_time = time.localtime(3600*24*365)
  10. print(time.strftime('%Y-%m-%d %X',struct_time))
  11. # 格式化时间 --》 结构化时间
  12. format_time = time.strftime('%Y-%m-%d %X')
  13. print(time.strptime(format_time,'%Y-%m-%d %X'))
  14. # 结构化时间 --》 时间戳
  15. struct_time = time.localtime(3600*24*365)
  16. print(time.mktime(struct_time))
  17. # 时间戳 --》 结构化时间
  18. time_stamp = time.time()
  19. print(time.localtime(time_stamp))

datetime模块

datetime模块:时间上可以加减

  1. import datetime
  2. now = datetime.datetime.now()
  3. print(now)
  4. # 2019-09-28 19:53:31.924508
  5. # 默认3天
  6. print(now + datetime.timedelta(3))
  7. # 加3周
  8. print(now + datetime.timedelta(weeks=3))
  9. # 加3小时
  10. print(now + datetime.timedelta(hours=3))
  11. # 减3小时
  12. print(now - datetime.timedelta(hours=3))
  13. print(now + datetime.timedelta(hours=-3))
  14. print(now.replace(year=1949, month=10, day=1, hour=10, minute=1, second=0, microsecond=0))
  15. # 1949-10-01 10:01:00

random模块

random 主要用于生成随机数

方法 描述
random.random() 生成 0-1 的随机数
random.randint(1,10) 生成指定序列的随机数
random.randrange(1,3) 生成指定序列的随机数
random.shuffle([1,2,45,6,8]) 随机打乱顺序
  1. import random
  2. # 打印 0-1 的随机数,并不是真正的随机
  3. print(random.random())
  4. # 0.6629366744271181
  5. # 打印随机数(1-10)
  6. print(random.randint(1,10))
  7. # 6
  8. # 大于等于1且小于3的整数
  9. print(random.randrange(1,3))
  10. # 1
  11. # 大于1小于3的小数
  12. print(random.uniform(1,3))
  13. # 2.0132434909012336
  14. # 随机,打乱顺序
  15. lis = [1,4,5,7,]
  16. random.shuffle(lis)
  17. print(lis)
  18. print(random.choice(lis))
  19. # 4

argparse 模块

argparse

这个模块可以帮助我们解析一些命令行传过来的参数并做一些处理

就像这样

python run.py --agt 6 --usr 1 --max_turn 40 --episodes 150 --movie_kb_path .\deep_dialog\data\movie_kb.1k.p --run_mode 2

  1. def add_parser(parser):
  2. # 添加一些可选参数
  3. parser.add_argument("-dog", dest="dog", default="输入一只狗的名字", type=str, help="输入一只狗的名字/命令")
  4. parser.add_argument("-u", "--ssh_user", dest="ssh_user", required=False, help="shh的用户名, 比如: root")
  5. parser.add_argument("-tn", "--thread_num", dest="thread_num", required=False, help="并发线程数, 比如: 10")
  6. def init_base():
  7. # 声明一个参数解析对象
  8. parser = argparse.ArgumentParser(prog="bible", description="统一自动化工具")
  9. subparser = parser.add_subparsers(title="统一自动化工具", description="可用功能", help="功能具体使用", dest="action")
  10. # 功能模板
  11. template_parser = subparser.add_parser("template",help="功能")
  12. add_parser(template_parser)
  13. # #解析参数
  14. args = parser.parse_args()
  15. init_base()

--dog - 代表一个可选参数 也可以写成一个- -dog

dest - 保存到ArgumentParser对象时的 参数名,

default - 默认值,如果不输入参数默认显示到终端的名字

type - 将输入的字符串转化成改数据类型

help - 输入--help 时获得的帮助

required - 该命令行选项是否可以省略(只针对可选参数)。

action - 在命令行遇到该参数时采取的基本动作类型。

  1. [root@localhost]# python test.py -h
  2. usage: bible [-h] {template} ...
  3. 统一自动化工具
  4. optional arguments:
  5. -h, --help show this help message and exit
  6. 统一自动化工具:
  7. 可用功能
  8. {template} 功能具体使用
  9. template 功能
  10. [root@localhost]# python test.py template -h
  11. usage: bible template [-h] [-dog DOG] [-u SSH_USER] [-tn THREAD_NUM]
  12. optional arguments:
  13. -h, --help show this help message and exit
  14. -dog DOG 输入一只狗的名字/命令
  15. -u SSH_USER, --ssh_user SSH_USER
  16. shh的用户名, 比如: root
  17. -tn THREAD_NUM, --thread_num THREAD_NUM
  18. 并发线程数, 比如: 10

configparser模块

configparser 模块主要用于 读取配置文件内容

有如下配置文件

  1. # test.cfg
  2. # 注释1
  3. ; 注释2
  4. [section1]
  5. k1 = v1
  6. k2:v2
  7. user=egon
  8. age=18
  9. is_admin=true
  10. salary=31
  11. [section2]
  12. k1 = v1
  1. import configparser
  2. # 定义对象 并读取cfg 配置文件
  3. config = configparser.ConfigParser()
  4. config.read("test.cfg")
  5. # 查看所有的标题
  6. res = config.sections()
  7. print(res)
  8. # ['section1', 'section2']
  9. # 查看标题 下所有key
  10. opt = config.options("section1")
  11. print(opt)
  12. # ['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
  13. # 查看标题 下所有key的值
  14. items_list = config.items("section1")
  15. print(items_list)
  16. # [('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]
  17. # 查看标题下 指定key 的值
  18. val = config.get("section1","user")
  19. print(val)
  20. # egon
  21. # 查看标题下 指定key 是数字的 的值
  22. val_int = config.getint("section1","age")
  23. print(val_int)
  24. # 18
  25. val = config.getint("section1","age")
  26. print(val)
  27. # 18

hashlib模块和hmac模块

hashlib 模块主要对字符串加密

hmac 模块不仅对字符加密,还加上了密钥,更加安全

  1. import hashlib
  2. import hmac
  3. # hashlib
  4. m = hashlib.md5()
  5. m.update(b"qinyj123")
  6. res = m.hexdigest()
  7. print(res)
  8. # a18973e94364927b08e7509dd3dbfde2 对于不同的字符而言,用不重复的密码
  9. # hmac
  10. m = hmac.new(b"qin1yj123123") # 加了一层密码
  11. m.update(b"qinyj123")
  12. res = m.hexdigest()
  13. print(res)
  14. # df1a1fcfaa4ec033406fe608b08ba45a

typing模块

typing 函数主要与函数一起连用,控制函数参数的数据类型用的,提供了基础数据类型之外的数据类型

  1. lt = [1,2,3,4]
  2. print(type(lt) is list)
  3. # True
  4. from typing import Iterable,Generator
  5. def func(x:int, lt:Iterable) -> list:
  6. return lt
  7. res = func(10,lt)
  8. print(res)
  9. # [1, 2, 3, 4]

re模块

正则表达式,去字符串找符合某种特点的字符串

元字符 描述
^ 匹配规则:以什么什么开头
$ 匹配规则:以什么什么结尾
. 匹配任意字符
\d 匹配 数字的
\D 匹配 非数字的
\w 匹配 非空
\W 匹配 空的
\s 匹配 空
\S 匹配 非空
+ 匹配 + 号前面的一个字符至少匹配1个
? 匹配 ? 号前面的一个字符至少匹配0-1个
* 匹配 * 号前面的一个字符至少匹配0个
[] 匹配 [] 内的字符
[^] [^] 内的字符都不匹配
| 匹配 规则xx 或 规则xx
{n} 匹配 输入的n个字符,依次找出来几个符合的字符比如手机号13位
{1,2} 匹配 前面字符2个
贪婪模式 非贪婪模式
.* 一直匹配,直到匹配完毕 .*?进入非贪婪模式,匹配特定的

最常用的就是以下修饰符了

修饰符 描述
re.l 让匹配部分大小写
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
  1. import re
  2. # bug,应该都会打印出来
  3. # s = "dhjsfsnfsnk"
  4. # res = re.findall("",s)
  5. # print(res)
  6. # 以下全部是元字符
  7. # 1. ^ 以什么什么开头
  8. s = "sndkjbsfkbs"
  9. print(re.findall("^sn",s))
  10. # ['sn']
  11. print(re.findall("^fkb",s))
  12. # []
  13. # 2. $ 以什么什么结尾
  14. s = "sndkjbsfkbs"
  15. print(re.findall("bs$",s))
  16. # ['bs']
  17. print(re.findall("dmskdhs$",s))
  18. # []
  19. # 3. . 匹配任意字符
  20. s = "abc红abc"
  21. print(re.findall(".",s))
  22. # ['a', 'b', 'c', '红', 'a', 'b', 'c']
  23. print(re.findall(".add",s))
  24. # []
  25. # 4. \d 匹配数字
  26. s = "sndkjbsfkbs13275242sadbhajsv"
  27. print(re.findall("\d",s))
  28. # ['1', '3', '2', '7', '5', '2', '4', '2']
  29. # 5. \w 匹配非空即不打印空,包括数字字母下划线
  30. s = "abc"
  31. print(re.findall("\w",s))
  32. # ['a', 'b', 'c']
  33. s = "a b c,dsds"
  34. print(re.findall("\w",s))
  35. # ['a', 'b', 'c']
  36. # 6.\s 匹配空
  37. s = "abc"
  38. print(re.findall("\s",s))
  39. s = "a b c,dsds"
  40. print(re.findall("\s",s))
  41. # [' ', ' ']
  42. # 7. \D 匹配非数字
  43. s = "abc123"
  44. print(re.findall("\D",s))
  45. # ['a', 'b', 'c']
  46. # 8. \W 匹配空的
  47. s = "a b c"
  48. print(re.findall("\W",s))
  49. # [' ', ' ']
  50. # 9. \S 匹配非空的
  51. s = "a b c"
  52. print(re.findall("\S",s))
  53. # ['a', 'b', 'c']
  54. # 10. + 匹配 + 号前面的那一个字符 加上其他字符至少有一个就打印
  55. s = "12345"
  56. print(re.findall("23+",s))
  57. # ['23']
  58. # 11. ? 前面的一个字符0-1 个即可
  59. s = "dafxsehtrnt"
  60. print(re.findall("dat?",s))
  61. # ['f', 'fl']
  62. # 12. * 前面的一个字符至少0个
  63. s = "dafxsehtrnt"
  64. print(re.findall("@*",s))
  65. # ['', '', '', '', '', '', '', '', '', '', '', '']
  66. # 13. [] 只匹配中括号内的
  67. s = "dmksff"
  68. print(re.findall("[dmks]",s))
  69. # ['d', 'm', 'k', 's']
  70. # 14. [^] 中括号内的不匹配
  71. s = "dfa"
  72. print(re.findall("[^a]",s))
  73. # ['d', 'f']
  74. # 15. | 或
  75. s = "dsajbfasfbia"
  76. print(re.findall("dsa|bia",s))
  77. # ['dsa', 'bia']
  78. # 16. {2} 匹配前面的2个字符
  79. s = "fsdsfs"
  80. print(re.findall("fs{1,2}",s))
  81. # ['fs', 'fs']
  82. # 贪婪模式
  83. # .*
  84. s = "saaasaaas" # 找到最后
  85. print(re.findall("s.*s",s))
  86. # ['saaasaaas']
  87. # 非贪婪模式 .*?
  88. s = "saaasaaas" # 找到第一个不找了
  89. print(re.findall("s.*?s",s))
  90. # ['saaas']
  91. # 匹配邮箱
  92. # s = '#@#@#@nickchen121@163.com$$$$////nick@qq.com$$#$#$[]]2287273393@162.com@$2423423lksdlfj#'
  93. s = "{|}{}|PP~#&(*$(^1342542daj@162.com/,/<>>]]}{}nicsh_snn@qq.comdsff1232//1213#$%^^asnjkgsa123@gmail.comdwanua"
  94. print(re.findall("\w+@\w+.com",s))
  95. # ['1342542daj@162.com', 'nicsh_snn@qq.com', 'asnjkgsa123@gmail.com']
  96. # compile
  97. s = '3728427482097jkcbdscvdb}:{}:{'
  98. email_pattern = re.compile("\w+@\w+.com")
  99. phone_pattern = re.compile("\d{13}")
  100. print(re.findall(phone_pattern,s))
  101. # ['3728427482097']
  102. # match 从开头找一个,找到不找了报错
  103. # s = 'ab abcddd abc'
  104. # res = re.match('ab*', s)
  105. # print(res.group())
  106. # search 从字符串找一个就不找了
  107. s = 'ab abcddd abc'
  108. res = re.search("abcd*",s)
  109. print(res.group())
  110. # split 不匹配数字,以数字为分隔符
  111. s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
  112. print(re.split("\d+",s))
  113. # ['ab', 'abcddd', 'abcasdfjlasjdk', 'l', 'lk', 'j', 'kl', 'kl', 'k', 'j', 'kl', 'j', 'lkj']
  114. # sub == replace
  115. s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
  116. print(re.sub("\d+","",s))
  117. # ababcdddabcasdfjlasjdkllkjklklkjkljlkj
  118. # subn 替换了多少次
  119. s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
  120. print(re.subn("\d+","",s))
  121. # ('ababcdddabcasdfjlasjdkllkjklklkjkljlkj', 12)
  122. # 修饰符 re.S 会让.匹配换行符
  123. s = '''abc
  124. abcabc*abc
  125. '''
  126. print(re.findall("abc.abc",s))
  127. # ['abc*abc']
  128. print(re.findall("abc.abc",s,re.S))
  129. # ['abc\nabc', 'abc*abc']
  130. # 无名分组 只要括号里的
  131. s = 'abc abcd abcdd'
  132. print(re.findall("a(.)c(d)",s))
  133. # [('b', 'd'), ('b', 'd')]
  134. # 有名分组
  135. s = 'abc abcd abcdd'
  136. print(re.search("a(?P<name1>.)c(?P<name2>d)",s).groupdict())
  137. # {'name1': 'b', 'name2': 'd'}
  138. # 超高级用法
  139. s = 'abc123abc123'
  140. print(re.sub("c(\d+)a"," ",s))
  141. # ab bc123
  142. print(re.sub("c(?P<name1>\d+)a"," \g<name1> " ,s))
  143. # ab 123 bc123

Python-包与常用模块(2)的更多相关文章

  1. python基础31[常用模块介绍]

    python基础31[常用模块介绍]   python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...

  2. python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  3. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  4. Python【第五篇】模块、包、常用模块

    一.模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  5. python模块部分----模块、包、常用模块

    0.来源:https://www.cnblogs.com/jin-xin/articles/9987155.html 1.导入模块 1.1模块就是一个python文件,模块名是文件名 1.2导入模块的 ...

  6. Python基础之--常用模块

    Python 模块 为了实现对程序特定功能的调用和存储,人们将代码封装起来,可以供其他程序调用,可以称之为模块. 如:os 是系统相关的模块:file是文件操作相关的模块:sys是访问python解释 ...

  7. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  8. Python全栈开发之路 【第六篇】:Python基础之常用模块

    本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...

  9. 模块、包及常用模块(time/random/os/sys/shutil)

    一.模块 模块的本质就是一个.py 文件. 导入和调用模块: import module from module import xx from module.xx.xx import xx as re ...

  10. Day06:迭代器,生成器,生成表达式,面向过程编程,包及常用模块

    今日内容:1.迭代器(****)2.生成器(***)3.生成器表达式(*****)4.面向过程编程(*****)5.包的使用(***)6.常用模块    logging (*****)    re ( ...

随机推荐

  1. C语言中static用法介绍

    C语言中static用法介绍     对于新手来说,很多东西的用法还不是很清楚,我们今天一起来看看C语言中static用法介绍     1.声明了static的变量称为静态变量,根据作用域的不同又分为 ...

  2. Codeforces 1182A Filling Shapes

    题目链接:http://codeforces.com/problemset/problem/1182/A 思路:n为奇数时不可能完全填充,ans = 0.发现若要完全填充,每俩列可产生俩种情况,所以为 ...

  3. 剑指offer——05重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  4. iOS开发系列-自动化分发测试打包

    概述 项目在测试阶段需要频繁打包给测试人员,对于这些固定化的操作我们可以使用自动化的手段去解决,将时间放在有意义的事情上. xcodebuild 是苹果发布自动构建的工具. Shell脚本打包 xcr ...

  5. js数组方法 slice()和splice()

    说实在我之前都不怎么分的清这个两个函数,因为这两个函数名字那么像,经常我就弄混了,平常使用的时候都先查一下我需要使用的实际是哪个函数.这样不说很浪费时间,但是也是影响了开发效率,所以我决定今天就彻底区 ...

  6. 利用VS 性能探查器 解决代码性能不高问题

    VS2017 分析-性能探查器 选择你想分析的项目,选择你的分析工具,我这边是遇到了一个cpu爆满的问题 启动后需要点击一下记录cpu,否则会没有后续的分析忘了截图了,下面是出的分析报告,分析时间比较 ...

  7. 一个切图仔的 JS 笔记

    1,常用数据操作 Math.round(mum,2);num.toFixed(2);两位数 Math.floor(); 返回不大于的最大整数 Math.ceil(); 则是不小于他的最小整数 Math ...

  8. zabbix配置文件解析

    zabbix的配置文件一般有三种:zabbixserver的配置文件zabbix_server.confzabbixproxy的配置文件zabbix_proxy.confzabbix_agentd的配 ...

  9. js字符串去重复

    var str="fdafdasfdasfdsfdseeeu"; function te(str){ var hash=[]; var arr=new Array(); var s ...

  10. 【转载】TCP拥塞控制算法 优缺点 适用环境 性能分析

    [摘要]对多种TCP拥塞控制算法进行简要说明,指出它们的优缺点.以及它们的适用环境. [关键字]TCP拥塞控制算法 优点    缺点   适用环境公平性 公平性 公平性是在发生拥塞时各源端(或同一源端 ...