首页 > 其他分享 >11.模块

11.模块

时间:2022-11-04 16:57:54浏览次数:61  
标签:11 __ 模块 import print path os

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 字符相关操作

  1. 完全匹配
    import re
    
    var = "我的名字是kunmzhao,大家都叫我kunmzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流"
    
    # 获取所有的匹配项
    print(re.findall('kunmzhao', var))  # ['kunmzhao', 'kunmzhao']
  2. 匹配指定的字符[abc]:匹配a或者b或者c
    import re
    
    var = "我的名字是kunmzhao,大家都叫我kzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流"
    
    print(re.findall('[kum]zhao', var))  # ['mzhao', 'kzhao']
  3. .:匹配除了换行符以外的任意一个字符
    import re
    
    var = "我的名字是kunmzhao,大家都叫我kzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流"
    
    print(re.findall('.zhao', var))  # ['mzhao', 'kzhao']
  4. \w:代指一个数字或者字母或者下划线
    import re
    
    var = "我的名字是kunmzhao,大家都叫我kzhao,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流"
    
    print(re.findall('\wzhao', var))  # ['mzhao', 'kzhao']
  5. \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 数字相关操作

  1. *:匹配前面表达式0次或者多次
    import re

    var = "我的名字是kunmzhao,大家都叫我kzhao,或者666,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流"

    print(re.findall('666*', var)) # ['666', '66']
  2. +:*:匹配前面表达式1次或者多次
    import re
    
    var = "我的名字是kunmzhao,大家都叫我kzhao,或者666,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流"
    
    print(re.findall('666+', var))  # ['666']
  3. ?:可以重复0次或者1次
    import re
    
    var = "我的名字是kunmzhao,大家都叫我kzhao,或者666,年龄18, 手机号是:17370314297, 邮箱为[email protected],欢迎大家一起来交流"
    
    print(re.findall('666?', var))  # ['666'']
  4. {n}:重复n次
  5. {n,}:重复n次或者多次
  6. {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') ]

 

 常用的匹配:

  1. 匹配手机号的正则表达式
    re.findall('^1[3578]\d{9}$')
  2. 匹配邮箱的正则表达式
    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

相关文章

  • delphi 11.2 配置Linux 开发环境
    1.rockylinux9 命令行: mvlibpython3.solibpython3.so_  ln-s/usr/lib64/libpython3.9.so.1.0libpython3.so打开防火墙:  命令 firewall-cmd--zon......
  • DS18B20模块温转代码
    staticssize_tds18b20_read(structfile*file,char__user*buf,size_tsize,loff_t*offset){unsignedlongflags;unsignedcharDL=0,DH=0;unsignedc......
  • 【题解】洛谷 P1134 [USACO3.2]阶乘问题
     1#include<iostream>2usingnamespacestd;34intmain(){5intn;6cin>>n;7intc=1,a=0,b=0;8for(inti=1;i......
  • VideoPipe可视化视频结构化框架新增功能详解(2022-11-4)
    VideoPipe从国庆节上线源代码到现在经历过了一个月时间,期间吸引了若干小伙伴的参与,现将本阶段新增内容总结如下,有兴趣的朋友可以加微信拉群交流。项目地址:https://github.......
  • 20221102 SMO1 HW
    YeahmaybeonetopicTemasimulationsthistopicwehaveontheagenda.IthinkthatthesmallestalsocrossovertoMDbecauseonoursideitalsositemainly......
  • #yyds干货盘点#【愚公系列】2022年11月 微信小程序-icon图标详解
    前言在小程序中经常会用到各种各样的图标,如果这些图标都使用图片的话,将会大大增加小程序打包后的体积,而小程序限制代码最大2MB,分包加载4MB,所以为了缩小体积,我们可以使用图......
  • P1103 书本整理 (DP)
    书本整理题目描述Frank是一个非常喜爱整洁的人。他有一大堆书和一个书架,想要把书放在书架上。书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上。但是Frank......
  • 在PetaLinux工程中导出所有关键模块代码
    PetaLinux工程会自动下载代码并编译。很多时候,工程师需要修改代码,加入调试信息。使用下列脚本,可以一次性导出所有关键模块的代码。脚本中,为了保持兼容性,导出了MPSoC和Vers......
  • Python内置模块FTPLIb的 STORLINES方法运行出错解决过程
    FTPLIbSTORLINES方法出错解决过程错误现象importftplibimportoptparseimportsysclassFTPWebpageDetect:def__init__(self)->None:self.target......
  • Java学习——11.04
    因为昨天学的有点少,上不了台面,所以和今天的一起写,当然还可能是自己太懒了,昨天的没记住,于是又看了一遍。1.变量:局部变量(和C一样的)实例变量(加new引用文件名创建函数......