[Python4]模块与包_内置模块

模块与包,内置模块

模块与包

模块定义

  • 模块:用来从逻辑上组织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(),无需重复从模块中反复查找该方法。

内置模块

模块的分类

  1. 标准库
  2. 开源模块
  3. 自定义模块

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-序列化与反序列化

http://blog.zhenhuizhang.tk/post/python-xue-xi-bi-ji-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