模块

加载模块

模块简单来说是用来定义函数、类、变量的python脚本文件。

模块的分类

  • 根据来源不同:可分为内置模块、第三方模块以及自建模块。

无论哪一种模块,都需要放在正确的路径下,让python可以找到,然后才可以成功加载。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#查看python解释器默认的寻找目录
import sys, pprint, os
pprint.pprint(sys.path)
['',    
 '/home/shensuo/miniconda3/lib/python38.zip',
 '/home/shensuo/miniconda3/lib/python3.8',
 '/home/shensuo/miniconda3/lib/python3.8/lib-dynload',
 '/home/shensuo/miniconda3/lib/python3.8/site-packages']
##注意第一个空字符应该表示当前路径

#os.system("ls /home/shensuo/miniconda3/lib/python3.8")
#如果是自建模块,需要将模块放到上面的路径之一,或者再另添加新的路径(如下代码)
sys.path.append("/home/shensuo/python")
  • 根据组成不同:可分为简单模块和包两类,二者在加载时有一定的区别

(1)简单模块:就是一个python脚本,里面定义了若干函数等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#加载方式1:加载模块,使用具体某个函数时-- module.fucntion
import copy
copy.deepcopy()

#加载方式2:加载模块的所有函数,使用具体某个函数时,直接交代函数名
from copy import *
deepcopy()

#加载方式3:仅加载模块的指定函数
from copy import deepcopy
from copy import deepcopy as dpc #函数重命名

(2)包package:将多个py脚本组织在一个目录下;可以有多层,每一层都需要有一个__init__文件

Python Packages with Examples - Python Geeks
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#包可以理解为复杂的模块,如下创建了具有两层结构的简单的包
tree package/
# package/
# ├── __init__.py
# ├── mod1.py
# └── subpack
#     ├── __init__.py
#     └── mod2.py


#加载第一层
##(1)
#from package import * #第一层的所有模块
from package import mod1 #第一层的指定模块
mod1.print1()
##(2)
import package.mod1
package.mod1.print1()
##(3)
from package.mod1 import print1
print1()

#加载第二层
##(1)
from package.subpack import mod2 #第二层的指定模块
mod2.print2()
##(2)
import package.subpack.mod2
package.subpack.mod2.print2()

作为包的文件结构中必须包含 __init__.py文件。它可以仅仅是空白文件,也可以很重要的作用,暂且不提。

探索模块

  • 模块包含什么

(1)dir(): 可列出对象的所有属性。对于模块来说,列出所定义的函数、类、变量

1
2
3
4
5
6
7
#需要先加载
import copy
dir(copy)

#以下划线开头的,并非给外部使用
[n for n in dir(copy) if not n.startswith("_")]
## ['Error', 'copy', 'deepcopy', 'dispatch_table', 'error']

(2)__all__: 模块自定义变量。返回一个列表,包含for module import *语句所加载的属性

1
2
3
4
#需要先加载
import copy
copy.__all__
## ['Error', 'copy', 'deepcopy']
  • 查看模块的帮助文档
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#需要先加载
import copy

##(1)help()
help(copy) #模块的帮助信息
help(copy.copy) #函数的帮助信息

##(2)__doc__
print(copy.__doc__)  #模块的文档
print(copy.copy.__doc__)  #函数的文档

##(3)__file__
print(copy.__file__)  #查看模块的源代码文件储存路径

常用模块

sys

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
##(1) sys.argv 给脚本传参
#如下定义一个sys.py脚本
#!/usr/bin/env python
import sys
print(sys.argv[0]) #第0个参数为脚本名
print(sys.argv[1])


python sys.py first
# sys.py
# first


##(2) sys.path 一个列表,包含要在其中查找模块的目录名称
sys.path.append()

os

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
## (1) os.system 执行shell命令
os.system("pwd")
os.system("ls -lh")

## (2) os.path 路径操作相关
os.path.abspath(".")  #返回绝对路径
os.path.basename("/home/test/file.txt") #单独返回文件名
os.path.dirname("/home/test/file.txt")  #单独返回路径名
os.path.split("/home/test/file.txt") #返回由文件名和路径名组成的元组
#('/home/test', 'file.txt')
os.path.splitext("file.txt")  #将文件名与后缀名分开
#('file', '.txt')
os.path.exists("/home/test/file.txt") #判断文件或者目录是否存在
#False


## 此外os模块还支持对目录、文件的常规操作,例如创建、删除、重命名等

time

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import time

time.sleep(3) #解释器等待指定秒数

time.time() #当前时间至新纪元的秒数(时间戳)
# 1649984110.885341

time.localtime() #默认返回当前时间戳的时间元组
time.localtime(100000000) #返回指定时间戳时间元组
# time.struct_time(tm_year=1973, tm_mon=3, tm_mday=3, tm_hour=17, tm_min=46, tm_sec=40, tm_wday=5, tm_yday=62, tm_isdst=0)
tuple(time.localtime(100000000)) # 返回tuple
# (1973, 3, 3, 17, 46, 40, 5, 62, 0)

###将时间元组格式化输出
time.asctime(time.localtime()) 
# 'Fri Apr 15 08:59:43 2022'
###(1)按自定义格式输出
#常见的item有: %Y-年, %m-月, %d-日, %H-时, %M-分, %S-秒, %a-星期几, %b-英文月份
#全部的item参考:https://www.runoob.com/python/python-date-time.html
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 
# '2022-04-15 09:12:29'


time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()) 
# 'Fri Apr 15 09:12:49 2022'

###(2)将格式字符串转换为时间戳
a = "2022-04-15 09:12:29"
time.mktime(time.strptime(a,"%Y-%m-%d %H:%M:%S"))
# 1649985149.0

关于时间元组的格式:

image-20220415090450807

random

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from random import *

#(1)返回指定区间的一个随机实数
uniform(0,10)

#(2)返回指定区间的一个随机整数,注意不包含区间的上边界
randrange(1,5)  #不会返回5
randrange(5) #默认为randrange(0, 5) 

#(3)从给定序列中随机返回一个值,可以是列表、元组、字符串
choice([1,3,5,7])

#(4)从给定序列中随机返回n个不同的元素
sample(range(10),3)
# [3,5,6]

#(5)打乱给定序列的顺序
a = [1,3,5,7]
shuffle(a)
a
# [7, 5, 1, 3]

可通过设置随机种子random.seed(n),确保下一次抽样结果与先前相同种子的抽样结果相同。