1.模块的介绍
之前我们在介绍函数的时候,认为函数是为了实现某个功能而集成的代码,可以帮助我们提高代码的复用性,实现函数式编程
模块也有类似的功能,将一些针对某个模块的所有函数存放在一个文件下,就实现了模块化,所以我们认为一个.py文件就是一个模块
导入模块的目的就是使用模块中方法
我们有时也会听到包的概念,包就是一个文件夹,里面包含多个模块
注意:
在python2版本中包中必须有__init__.py的文件,但在python3中则可有可无
2.模块的导入方式
2.1导入路径
我们想使用某个模块中的函数,就必须先导入该模块,类似C语言中的include,在python内部默认设置了一些路径,导入模块和包的时候,会按照顺序去逐一的查找
import sys print(sys.path) # [
'C:\\Users\\11026\\PycharmProjects\\pythonProject',
'C:\\Users\\11026\\PycharmProjects\\pythonProject',
'C:\\Users\\11026\\AppData\\Local\\Programs\\Python\\Python39\\python39.zip',
'C:\\Users\\11026\\AppData\\Local\\Programs\\Python\\Python39\\DLLs',
'C:\\Users\\11026\\AppData\\Local\\Programs\\Python\\Python39\\lib',
'C:\\Users\\11026\\AppData\\Local\\Programs\\Python\\Python39',
'C:\\Users\\11026\\PycharmProjects\\pythonProject\\venv',
'C:\\Users\\11026\\PycharmProjects\\pythonProject\\venv\\lib\\site-packages'
]
当然我们也可以手动的添加路径到该列表中
import sys sys.path.append("路径A") import xxxxx # 导入路径A下的一个xxxxx.py文件
注意事项:
我们在以后自定义模块的名字时千万不要和以后模块名重复!!!
2.2 导入方式
模块导入的本质就是将模块的所有内容加载到内存中
python中导入的方式通过关键字 import 和 from实现
2.2.1 imort x实现
这种方式一般是直接导入内置模块
import sys import os import hashlib
2.2.2 from xx import x实现
该种方式是最常用,常用语从某个包中导入模块,如果包的层级很深,可以如下操作,通过.的方式进行导入
2.2.3 相对导入
相对导入常用语同一个模块下之间的导入,会更加简便
2.2.4 导入别名的使用
别名通过关键字as实现,目的就是给模块起一个别名,比如模块名太长或者和已存在的模块重名
3.自定义模块
自定义模块是很简单的,就是创建一个文件,再创建一些.py文件,然后定义函数即可
我们在工作中最常见的就是写一些脚本,也就是一个单文件程序,我们定义可以采用如下方式
def run(): pass if __name__ == '__main__': run()
当我们去执行脚本的时候,__name__就会变成__main__, 但要注意:只有是以主文件的形式运行此脚本时run函数才会执行,被导入时则不会被执行。
4.常用的内置模块
python内嵌了很多常用的模块供我们直接使用,可以很好的帮助我们开发,下面我们总结一下常用的模块
4.1 os
产看路径相关操作
import os # 产看文件的绝对路径 print(os.path.abspath(__file__)) # C:\Users\11026\PycharmProjects\pythonProject\mypacket\test2.py # 查看文件的上层目录 print(os.path.dirname(os.path.abspath(__file__))) # C:\Users\11026\PycharmProjects\pythonProject\mypacket # 产看路径是否存在 print(os.path.exists(os.path.abspath(__file__))) # True # 拼接路径 print(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'hello', 'world.txt')) # C:\Users\11026\PycharmProjects\pythonProject\mypacket\hello\world.txt # 产看路径是不是文件 print(os.path.isfile(os.path.abspath(__file__))) # True # 查看路径是不是文件夹 print(os.path.isdir(os.path.abspath(__file__))) # False # 查看当前路径下的所有文件及文件夹 print(os.listdir(os.path.dirname(os.path.abspath(__file__)))) # ['info', 'test.py', 'test2.py', '__init__.py', '__pycache__'] # 创建文件夹,文件夹已存在,则报错 print(os.mkdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'info2')))
# 删除文件
os.remove(path)
# 查看当前路径下的所有文件,文件夹及子文件 gen = os.walk(os.path.dirname(os.path.abspath(__file__))) print(gen) # <generator object _walk at 0x0000026198119660> for path, dir_list, file_list in gen: for file_name in file_list: file_abs_path = os.path.join(path, file_name) print(file_abs_path) """ C:\Users\11026\PycharmProjects\pythonProject\mypacket\test.py C:\Users\11026\PycharmProjects\pythonProject\mypacket\test2.py C:\Users\11026\PycharmProjects\pythonProject\mypacket\__init__.py C:\Users\11026\PycharmProjects\pythonProject\mypacket\info\hello.py C:\Users\11026\PycharmProjects\pythonProject\mypacket\info\__init__.py C:\Users\11026\PycharmProjects\pythonProject\mypacket\__pycache__\__init__.cpython-39.pyc """
4.2 sys
该模块用于操作系统的,可以查看系统信息或者执行系统指令
import sys # 查看模块导入路径 print(sys.path) # 获取解释器版本 print(sys.version) # 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] print(sys.version_info) # sys.version_info(major=3, minor=9, micro=1, releaselevel='final', serial=0) # 获取脚本执行参数 print(sys.argv) # ['.\\test2.py', '-h', '127.0.0.1', '-p', '8000']
4.3 random
该模块用于产生随机数
import random # 随机产生0-1之间的浮点数 print(random.random()) # 0.5425225053105313 # 随机产生指定范围内的浮点数 print(random.uniform(10, 20)) # 10.755647797095572 # 随机产生范围内的整数 print(random.randint(10, 20)) # 16 # 从序列中随机抽取一个元素 print(random.choice([1, 2, 3, 4, 5])) # 3 # 从序列中随机产生多个元素 print(random.sample([1, 2, 3, 4, 5], 3)) # [3, 1, 4] # 打乱容器内元素的顺序 var = [1, 2, 3, 4, 5] random.shuffle(var) print(var) # [4, 3, 2, 1, 5]
4.4 hashlib
该模块用于加密,我们常用的加密方式就是md5加密,该种加密是不可逆的,但是相同数据加密之后的密文是一样的,所以可以加盐
我们在实际开发中,数据库存储的用户密码常用该模块进行加密,将密文存储在数据库,用户数据的明文密码需要经过加密和数据库的密码作比较,当数据库泄露,用户的密码也不会泄露
不加盐的加密方式
import hashlib hash_object = hashlib.md5() hash_object.update('今晚去老地方,死鬼,么么哒'.encode('utf-8')) res = hash_object.hexdigest() print(res) # 2f324f2a142bf9a24a6f23a547436f19
加盐的加密方式
import hashlib SALT = 'aslkjfla23849@#$@kdshf-_sfs' hash_object = hashlib.md5(SALT.encode('utf-8')) hash_object.update('今晚去老地方,死鬼,么么哒'.encode('utf-8')) res = hash_object.hexdigest() print(res) # c6150739df218ef8e74145aeada26f7b
4.5 shutil
该模块主要对文件和文件夹的增删改查操作import osimport shut
# 递归的删除文件夹 path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'info') # shutil.rmtree(path) # 递归的复制文件夹 # shutil.copytree(src, dest) # 文件或者文件夹的移动或者重命名 # shutil.move(src, dest) # 压缩文件 """
# base_name,压缩后的压缩包文件 # format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar". # root_dir,要压缩的文件夹路径 """ # shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files') # 解压文件 """ # filename,要解压的压缩包文件 # extract_dir,解压的路径 # format,压缩文件格式 """ # shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')
4.6 json
我们在数据交互中,常用的数据格式就是Json,这个在学习后面的前后端分离中尤为明显
该模块可以将python中的数据类型转换为json,也可以讲json转化为python可以识别的数据类型
python默认支持的转json类型有如下
+-------------------+---------------+ | Python | JSON | +===================+===============+ | dict | object | +-------------------+---------------+ | list, tuple | array | +-------------------+---------------+ | str | string | +-------------------+---------------+ | int, float | number | +-------------------+---------------+ | True | true | +-------------------+---------------+ | False | false | +-------------------+---------------+ | None | null | +-------------------+---------------+
4.6.1 序列化
序列化指的是将python中的数据类型转化为json格式
import json var_dict = {'name':'kunmzhao', 'age':18, 'hobby':['篮球', '足球']} print(json.dumps(var_dict)) # {"name": "kunmzhao", "age": 18, "hobby": ["\u7bee\u7403", "\u8db3\u7403"]} print(json.dumps(var_dict, ensure_ascii=False)) # {"name": "kunmzhao", "age": 18, "hobby": ["篮球", "足球"]}
可以看到,json个数据格式和python的字典还是很像的,但是区别还是有的,json必须是双引号
4.6.2 反序列化
反序列化指的是将json格式数据转化为python的数据类型
import json print(json.loads('{"name": "kunmzhao", "age": 18, "hobby": ["\u7bee\u7403", "\u8db3\u7403"]}')) # {'name': 'kunmzhao', 'age': 18, 'hobby': ['篮球', '足球']}
4.7 datetime
处理日期,时间
from datetime import datetime, timedelta # 当前时间,返回的是一个时间对象,而不是一个字符串 now = datetime.now() print(now, type(now)) # 2022-11-04 14:45:23.091874 <class 'datetime.datetime'> # 将时间对象转化为字符串 """ %Y:年 %m:月 %d:日 %H:小时 %M:分钟 %S:秒钟 """ print(now.strftime('%Y-%m-%d %H:%M:%S')) # 2022-11-04 14:48:44 # 将字符串转化为时间对象:注意时间字符串和格式必须严格一一对应 print(datetime.strptime('2022-11-04 14:48:44', '%Y-%m-%d %H:%M:%S')) # 时间戳:距离1970年1月1日 00:00:00的时间 print(datetime.timestamp(datetime.now())) # 1667544827.88173 # 将时间戳装换为时间对象 print(datetime.fromtimestamp(1667544827.88173)) # 2022-11-04 14:53:47.881730 # 时间间隔:时间对象-时间对象, 时间对象+时间 print(datetime.now() + timedelta(days=1, hours=-2)) # 2022-11-05 12:59:59.009928 # 获取时间间隔的日 秒 毫秒 time1 = datetime.now() time2 = datetime.now() + timedelta(days=366, hours=10, minutes=15) t = time2 - time1 print(type(t)) # <class 'datetime.timedelta'> print(t.days, t.seconds, t.microseconds) # 366 36900 0
4.8 time
处理时间
import time # 获取时间戳 print(time.time()) # 1667545844.9031467 # 获取微秒 print(time.time_ns()) # 1667545844903146800 # 当前线程睡眠的100秒 time.sleep(100)
4.9 re
该模块用于处理正则匹配,应用场景一般为用户输入的信息,我们需要判断是否合法
正则匹配是针对字符串做处理的
4.9.1 字符相关操作
- 完全匹配
import re var = "我的名字是kunmzhao,大家都叫我kunmzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流" # 获取所有的匹配项 print(re.findall('kunmzhao', var)) # ['kunmzhao', 'kunmzhao']
- 匹配指定的字符[abc]:匹配a或者b或者c
import re var = "我的名字是kunmzhao,大家都叫我kzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流" print(re.findall('[kum]zhao', var)) # ['mzhao', 'kzhao']
- .:匹配除了换行符以外的任意一个字符
import re var = "我的名字是kunmzhao,大家都叫我kzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流" print(re.findall('.zhao', var)) # ['mzhao', 'kzhao']
- \w:代指一个数字或者字母或者下划线
import re var = "我的名字是kunmzhao,大家都叫我kzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流" print(re.findall('\wzhao', var)) # ['mzhao', 'kzhao']
- \d:代指一个数字
import re var = "我的名字是kunmzhao,大家都叫我kzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流" print(re.findall('\d', var)) # ['1', '8', '1', '7', '3', '7', '0', '3', '1', '4', '2', '9', '7', '1', '1', '0', '2', '6', '6', '9', '4', '7', '4']
4.9.2 数字相关操作
- *:匹配前面表达式0次或者多次
import re
var = "我的名字是kunmzhao,大家都叫我kzhao,或者666,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流"
print(re.findall('666*', var)) # ['666', '66'] - +:*:匹配前面表达式1次或者多次
import re var = "我的名字是kunmzhao,大家都叫我kzhao,或者666,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流" print(re.findall('666+', var)) # ['666']
- ?:可以重复0次或者1次
import re var = "我的名字是kunmzhao,大家都叫我kzhao,或者666,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流" print(re.findall('666?', var)) # ['666'']
- {n}:重复n次
- {n,}:重复n次或者多次
- {n,m}:重复n次到m次
4.9.3 括号提取数据
import re text = "楼主太牛逼了,在线想要 [email protected]和[email protected]谢谢楼主,手机号也可15131255789,搞起来15131266666呀" data_list = re.findall("15(13)1(2\d{5})", text) print(data_list) # [ ('13', '255789') ]
常用的匹配:
- 匹配手机号的正则表达式
re.findall('^1[3578]\d{9}$')
- 匹配邮箱的正则表达式
re.findall('^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$')
5.常用的第三方模块
使用pythn开发,一个很大的优势就是python有丰富的第三方库,数不胜数,学习第三方库只能在以后的开发中慢慢接触慢慢学习,通过他人口述,文档,或者网络了解第三方库。
下面仅仅对一个操作Excel的第三方库进行学习,以后其它的第三方库也可以这样去学习
5.1 模块的安装
想要使用第三方库首先需要安装该模块,在python中我们最常用的模块安装软件就是pip,该软件在我们安装python的时候会自动安装
安装方式
pip install 模块名称==版本号
pip 安装更改下载源
pip install 模块名 -i https://pypi.douban.com/simple/
查看本地的安装包
pip list
下载第三方模块 openpyxl
pip install openpyxl -i https://pypi.douban.com/simple/
5.2 模块的使用
5.2.1读取数据
from openpyxl import load_workbook # 1.打开excel对象 wb = load_workbook(r'C:\Users\11026\Desktop\Test.xlsx') print(wb) # <openpyxl.workbook.workbook.Workbook object at 0x000001419FD2F3A0> """ 对sheet的操作 """ # 获取excel中的所有sheets print(wb.sheetnames) # ['Sheet1', 'Sheet2', 'Sheet3'] # 选择 sheet --基于下表 print(wb.sheetnames[0]) # Sheet1 # 选择sheet -- 基于sheet名字 print(wb['Sheet2']) # <Worksheet "Sheet2"> """ 读取sheet中的单元格数据 """ sheet = wb['Sheet1'] # 获取一个单元格 cell = sheet.cell(1,1) # 获取单元格的数据 print(cell.value) # hello # 获取所有行的数据 print(sheet.rows) # <generator object Worksheet._cells_by_row at 0x00000232CE4F1190> for row in sheet.rows: print(row[0].value) # hello # 获取所有列的数据 print(sheet.columns) # <generator object Worksheet._cells_by_col at 0x000002DCDFF71190> for col in sheet.columns: print(col[0].value) # hello
5.2.2 写入操作
from openpyxl import load_workbook, workbook # 打开已存在的excel # wb = load_workbook('files/p1.xlsx') # 创建一个新的excel,默认会创建一个sheet(名称为Sheet) wb = workbook.Workbook() """ 对sheet的修改 """ # 修改sheet名称 sheet = wb.worksheets[0] sheet.title = "数据集" # 保存并命名excel wb.save("p2.xlsx") # 创建sheet sheet = wb.create_sheet("工作计划") wb.save("p2.xlsx") # 拷贝sheet new_sheet = wb.copy_worksheet(wb["Sheet"]) new_sheet.title = "新的计划" wb.save("p2.xlsx") # 删除sheet del wb["用户列表"] wb.save('files/p2.xlsx') """ 对单元格次修改 """ # 获取某个单元格,修改值 sheet["B3"] = "kunmzho" wb.save("p2.xlsx")
标签:11,__,模块,import,print,path,os From: https://www.cnblogs.com/victor1234/p/16855155.html