模块与包,内置模块
模块与包
模块定义
- 模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件。
包的定义
- 包:用来在逻辑上组织模块的,本质上就是一个目录(必须带有一个__init__.py的文件)。
导入方法
首先新建一个名为module_zzh的模块(即文件名为module_zzh.py的python文件),具体代码如下:
name = 'zzh'
def say_hello()
print("hello zzh")
再在另一个python程序中调用该模块
方法1
import module_zzh
print(module_zzh.name) #打印zzh
module_zzh.say_hello() #调用函数打印hello zzh
方法2
#该方法将模块内的所有内容一次性导入,若与当前代码有冲突,会被覆盖,不推荐使用
from module_zzh import * #*为导入全部,也可导入单个或者多个方法
print(name) #打印zzh
say_hello() #调用函数打印hello zzh
方法3
from module_zzh import say_hello as say_zzh #从...导入...并重命名为...
say_zzh() #执行say_zzh()
import 本质
- 导入模块的本质就是把 .py文件解释执行一遍(import test.py 等于 test='test.py all code')
- 导入包的本质就是执行该包下的__init__.py文件,若想要导入包下的模块,则需在__init__.py文件中写入:
from . import module_name#从当前目录下导入模块
然后再在需要使用该包下模块的地方写下如下代码:
import package_name
package_name.module_name.function()
- import module_name --> module_name.py --> 该文件的路径 --> sys.path
导入不同级目录下的模块或包
Foo/
|-- bin/
| |-- foo.py
|-- foo/
| |-- __init__.py
| |-- main.py
- 如果我是一个包下的foo.py,如何通过代码去调用另一个路径下的main.py,例子如下:
import os,sys
print(__file__)#获得当前文件的相对路径
print(os.path.abspath(__file__))#通过相对路径获得绝对路径
print(os.path.dirname(os.path.abspath(__file__)))#以当前绝对路径向上退一级
#再向上一级获得整个文件即Foo的绝对路径,并进行存储
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)#将文件目录加入到环境变量中
import foo#再引用foo包,则不会出现报错
导入优化
- 当在程序中需要反复使用模块下的某一方法时,可使用
from mudule_name import function_name
语句,在后续使用时即可直接使用function_name()
,无需重复从模块中反复查找该方法。
内置模块
模块的分类
- 标准库
- 开源模块
- 自定义模块
time与datetime模块
在Python中,通常有这几种方式来表示时间:1.时间截(当前时间减去1970年1月1日的时间,并换算成以秒为单位)2.格式化的时间字符串3.元组(struct-time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。
time模块
import time
print(time.time())#获取时间戳,以秒为单位
#1580731692.2341816
time.sleep(2)#程序暂停2秒
#在程序中,如需要进行延时等待,则可以使用sleep方法
print(time.gmtime())#获取元组为格式的时间信息,且时间为UTC时间
#time.struct_time(tm_year=2020, tm_mon=2, tm_mday=3, tm_hour=12, tm_min=12, tm_sec=18, tm_wday=0, tm_yday=34, tm_isdst=0)
print(time.localtime())#获取元组为格式的时间信息,且时间为本地时间
#time.struct_time(tm_year=2020, tm_mon=2, tm_mday=3, tm_hour=20, tm_min=14, tm_sec=20, tm_wday=0, tm_yday=34, tm_isdst=0)
#当使用`time.gmtime()`或`time.localtime()`时,若在括弧内填入时间戳,则将该时间戳转换为对应的元组格式的时间信息
x = time.time()#获取时间戳,以秒为单位
print(time.mktime(x))#将元组形式的时间信息转换为时间戳
print(time.strftime("%Y-%m-%d %H:%M:%S")#格式化输出当前的时间,格式可自行定义
#'2020-02-03 22:02:14'
time.strptime('2020-02-03 22:02:14',"%Y-%m-%d %H:%M:%S")#将字符串按给定格式转换为元组格式
#time.struct_time(tm_year=2020, tm_mon=2, tm_mday=3, tm_hour=22, tm_min=2, tm_sec=14, tm_wday=0, tm_yday=34, tm_isdst=-1)
print(time.asctime()) #括弧内可填入元组格式时间,若不填则为当前时间
#按照<星期 月份 日期 时 分 秒 年>的格式返回字符串
#'Mon Feb 3 22:46:52 2020'
print(time.ctime()) #括弧内可填入时间戳,若不填则为当前时间
#按照<星期 月份 日期 时 分 秒 年>的格式返回字符串
#'Mon Feb 3 22:46:52 2020'
datetime模块
import datetime #导入datetime模块
print(datetime.datetime.now()) #获取当前时间
#2020-02-03 23:09:43.661665
print(datetime.datetime.now()+datetime.timedelta(-3))#获取3天前的时间
#2020-01-31 23:09:43.661665
print(datetime.datetime.now()+datetime.timedelta(hours = 3))#获取3小时后的时间
#2020-02-04 02:09:43.661665
c_time = datetime.datetime.now()
print(c_time.replace(minute=3,hour=1))#修改时间的小时和分钟
#2020-02-03 01:03:43.661665
random模块
import random
print(random.random())#随机生成从0到1之间的浮点数
#0.4296419398834992
print(random.uniform(1,10))#随机生成从1到10之间的浮点数
#6.730488004175215
print(random.randint(1,10))#随机生成从1到10之间的整数,顾头顾尾
#3
print(random.randrange(1,10))#随机生成从1到9之间的整数,顾头不顾尾
#7
print(random.choice('hello'))#从传入的序列(字符串、列表、元组)中随机返回一个值
#'e'
print(random.sample('hello',2))#从给定序列(字符串、列表、元组)中随机返回两个值
#['h', 'l']
items = [i for i in range(10)]#生成0-9之间的序列
print(items) #打印序列
random.shuffle(items)#对序列进行随机洗牌
print(items) #再次打印序列
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#[4, 5, 0, 1, 3, 2, 9, 7, 6, 8]
使用random模块生成一个验证码:
checkcode = ' '#初始化一个空的验证码字符串
for i in range(4):#循环4次生成4位的验证码
current = random.randomint(0,9)#每次生成一个随机数
checkcode += str(current)#追加到验证码字符串的末尾
print(checkcode)#打印验证码字符串
os模块
import os
print(os.getcwd())#打印当前的操作目录
#E:\DIY\python\learn\2020.1.1learn\day2
os.chdir("C:\\Users")#将目前切换至C:\Users,双斜杠为转义符
os.chdir(r"C:\Users")#也可使用这种写法,推荐使用第二种
print(os.getcwd())#打印当前的操作目录
#C:\Users
print(os.curdir)#返回当前所在目录
#. ##表示当前目录
print(os.pardir)#返回当前所在目录
#.. ##表示当前目录的上级目录(父目录)
os.makedirs(r"C:\a\b\c\d")#在c盘下创建多级目录C:\a\b\c\d
os.removedirs(r"C:\a\b\c\d")#移除在c盘的多级目录C:\a\b\c\d
os.mkdirs(r"C:\a")#在c盘下创建单级目录C:\a
os.rmdirs(r"C:\a")#移除在c盘下的单级目录C:\a
print(os.listdir())#列出某一目录下的所有文件名,若空,则为当前目录
#['file_op.py', 'sys_demo.py', 'test.py', 'test.test', 'test2.py', 'yes', 'yesterday', '__init__.py']
os.remove(r'E:\DIY\python\learn\2020.1.1learn\day2\test.py')#删除文件
os.rename("oldname","newname")#重命名文件/目录
print(os.stat(r'test.py'))#查看文件的详细信息
#os.stat_result(st_mode=33206, st_ino=4503599627531586, st_dev=1719635471, st_nlink=1, st_uid=0, st_gid=0, st_size=2233, st_atime=1578497838, st_mtime=1578497838, st_ctime=1578497838)
print(os.sep)#输出该操作系统特定的路径分隔符,如linux为/,win为\
#\
os.linesep#输出该操作系统特定的换行分隔符
#'\r\n'
print(os.pathsep)#输出该操作系统用于分割环境变量的字符串
#;
print(os.environ)#打印当前系统的环境变量
#environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\ZZH\\AppData\\Roaming' })
os.system('ipconfig /all')#用于执行系统命令,如重新配置网络
print(os.path.abspath('.'))#通过相对路径获取绝对路径
#E:\DIY\python\learn\2020.1.1learn\day2
print(os.path.split(r'C:\a\b\c\zzh.txt'))#分割路径和文件名,以元组返回
#('C:\\a\\b\\c', 'zzh.txt')
print(os.path.dirname(r'C:\a\b\c\zzh.txt'))#获取文件所在目录
#C:\a\b\c
print(os.path.basename(r'C:\a\b\c\zzh.txt'))#获取文件名
#zzh.txt
print(os.path.exists(r'C:\a\b\c\zzh.txt'))#判断路径是否存在
#False
print(os.path.isabs(r'C:\a\b\c\zzh.txt'))#判断路径是否为绝对路径
#True
print(os.path.isfile(r'.\test.py'))#判断是否为文件
#True
print(os.path.isdir(r'.\test.py'))#判断是否为路径
#False
print(os.path.join(r'C:',r'/a.txt'))#拼接两个路径后返回
#C:/a.txt
print(os.path.getatime(r'test.py'))#获取文件最后的存取时间
#1578497838.0938847
print(os.path.getmtime(r'test2.py'))#获取文件最后的修改时间
#1580807455.1707966
sys模块
import sys
sys.argv #命令行参数list,第一个元素是程序本身的路径
sys.exit(n) #退出程序,正常退出时exit(0)
sys.version #获取当前运行的python解释器版本
sys,path #返回模块的搜索路径,默认为PYTHONPATH环境变量的值
shutil模块
import shutil #导入模块
f1 = open("原笔记","r",encoding="utf-8") #打开原文件,读模式
f2 = open("新笔记","w",encoding="utf-8")#新建新文件,写模式
shutil.copyfileobj(f1,f2) #复制文件内容
f1.close() #文件关闭
f2.close() #文件关闭
shutil.copyfile("原笔记","新笔记")#直接通过文件名复制文件内容
shutil.copystat("原笔记","新笔记")#复制文件权限,但不改动内容
shutil.copy("原笔记","新笔记")#同时复制文件的内容与权限
shutil.copytree("原目录","新目录")#递归的复制文件夹下的所有内容
shutil.rmtree("新目录")#递归的删除目录下所以内容
shutil.make_archive(base_name, format,...) #创建压缩包并返回文件路径,例如:zip、tar
#base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径;
#format: 压缩包种类,zip,tar,bztar,gztar;
#root_dir: 要压缩的文件夹路径(默认当前目录);
#owner: 用户,默认当前用户;
json与pickle模块
- 详见Python学习笔记2-序列化与反序列化
shelve模块
- shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式
import shelve #导入shelve模块
d = shelve.open('shelve_test') #打开一个文件
name = ["zzh","aaa","test"] #新建列表
d["test"] = name #持久化列表
d.close()关闭文件
print(d.items())#读取持久化文件内容
xml模块
详见:https://www.runoob.com/python3/python3-xml-processing.html
hashlib模块
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
import hashlib #导入模块
m=hashlib.md5() #生成个md5对象
m.update(b"Hello")#在对象末尾追加内容
print(m.hexdigest())#以16进制打印md5
m.update(b"It's me")#在对象末尾追加内容
print(m.hexdigest())#再次以16进制打印md5
#8b1a9953c4611296a827abf8c47804d7
#5ddeb47b2f925ad0bf249c52e342728a
hash = hashlib.sha1()#生成个sha1对象
hash.update(b'admin')#更新sha1的内容
print(hash.hexdigest())#以16进制打印sha1
#d033e22ae348aeb5660fc2140aec35850c4da997
#同理,还可使用sha256,sha384,sha512
参考资料:
https://www.cnblogs.com/alex3714/articles/5161349.html
https://docs.python.org/3.7/py-modindex.html