Python(5): 模块及常用的第三方模块

1 模块(Module)

1.1 模块的定义、功能和特点

  • 在Python中,一个后缀名为 $.py$的Python文件就是一个模块。
  • 模块中可以定义函数、类等,是特定功能代码的一种封装。
  • 模块也可以避免函数、类、变量等名称相冲突的问题。
  • 模块不仅提高了代码的可维护性,还提高了代码的可复用性。
  • 模块的命名规范如下:①全部使用小写字母;②多个单词之间使用下划线分隔。
  • 若自定义模块名称与系统内置模块名称相同,在导入时会优先导入自定义模块。

1.2 模块的分类

1.2.1 系统内置模块

有开发人员编写好的模块,在安装Python解释器时一同安装至计算机。

1.2.2 自定义模块

一个以 $.py$结尾的文件就是一个自定义模块。

1.2.2.1 作用

  1. 规范代码,将功能相同的函数、类封装到一个模块中,提高代码可读性。
  2. 可被其他模块调用,提高开发效率。

1.2.2.2 例10.1:自定义模块my\_info

# 假设本模块名为“my_info.py”
# 自定义变量
name='njsukleo'

# 自定义函数
def info():
    print(f'Hello, everyone. I am {name}')

1.2.3 第三方模块

由全球Python爱好者、程序员、各行各业的专家进行开发和维护。

1.2.3.1 安装与卸载(以下指令适用于cmd/Powershell)

安装:pip install module_name

卸载:pip uninstall module_name

升级pip:python -m pip install —upgrade pip

检测是否安装了某个第三方库:pip show module_name

1.3 模块的导入

1.3.1 import导入

  • 语法结构:import module_name [as alias]
  • 若模块名过长,允许在import后定义一个别名(alias)进行简便调用。
  • 注意,在取别名后,打点调用时必须使用别名。

1.3.2 from...import导入

  • 语法结构:from module_name import variant/function/class/*
  • 通过此方式可以导入模块中的变量、函数和类。$*$是通配符,表示导入全部内容。

1.3.3 例10.2-10.4:模块的导入

import my_info
print(my_info.name) # 打印自定义模块的变量
my_info.info() # 执行自定义模块的函数

import my_info as a # 定义别名
print(a.name)
a.info()

from my_info import name
print(name) # 此种方式不需要再打点调用
# info()使用不了,因为没有导入(NameError)

from my_info import info
info()

from my_info import * # 导入全部内容
print(name)
info()

# 同时导入多个模块
import math,time,random

# 调用时有同名变量或函数冲突:后者会覆盖前者
# 解决方法:使用import ...导入模块后单个打点调用变量或函数
# 假设有一个intro.py模块中与my_info.py有同名变量和函数
from my_info import *
from intro import *
info() # 此时会调用intro模块中的info函数

import my_info
import intro
my_info.info()
intro.info()
# 确保了两个函数不发生冲突

2 包(Package)

2.1 定义

包(package)是含有 $\verb|__init__.py|
$文件的文件夹(目录)。

可以避免模块名称相冲突的问题。

2.2 创建包

在PyCharm中右击目录,选择$\verb|New >> Python Package|
$,再进行命名即可。

包创建完成后,自带一个空的 $\verb|__init__.py|
$文件。

2.3 包的导入

2.3.1 import导入

导入语法结构:import package_name.module_name [as alias]

2.3.2 from...import导入

以“包名-模块名”导入的语法结构:from package_name import module_name [as alias] (打点调用)

以“包名.模块名-函数名/变量名”导入的语法结构:from package_name.module_name import variant/function_name [as alias] (无需打点调用)

2.3.3 init执行问题

不论使用哪种方法导入包,其中的$\verb|__init__.py|
$文件都会自动导入并执行。

这种执行只会在包初次被导入时发生且仅发生一次。

2.4 主程序运行(重要)

if __name__ == '__main__' :
    pass

2.4.1 例10.5:使用主程序运行阻止全局变量的输出执行

假设有以下模块$\verb|module_a.py|
$:

# module_a.py
print('welcome to Beijing')
name='njsukleo'
print(name)

同目录下,有$\verb|module_b.py|
$代码如下:

# module_b.py
import module_a

此时执行$\verb|module_b.py|
$,上一模块中的指令会被执行。若我们不想在导入模块的同时执行它们而只是导入,我们可以使用主程序运行避免其执行。

我们修改$\verb|module_a.py|
$内容如下:

# module_a.py
if __name__ == '__main__' :
    print('welcome to Beijing')
    name='njsukleo'
    print(name)

此时再执行$\verb|module_b.py|
$,导入模块的两句代码不再被执行。

3 常用系统内置模块/Python标准库

在安装Python解释器时一并安装进来的模块(大约270个)称为系统内置模块,也被称为标准模块或标准库。

标准库位置:$\verb|.../Python/Python3.11/Lib|
$

标准库名称说明
os与操作系统和文件相关操作有关
re在字符串中执行正则表达式
random产生随机数
json对高维数据进行编码和解码
time与时间相关
datetime与日期时间相关,可以方便地显示和运算日期

3.1 random模块

random模块是Python中用于产生随机数的标准库。

函数名称说明
seed(x)初始化给定的随机数种子,默认为当前系统时间戳
random()产生一个[0.0,1.0)之间的随机浮点数
randint(a,b)产生一个[a,b]之间的随机整数
randrange(m,n,k)产生一个[m,n)之间步长为k的随机整数
uniform(a,b)产生一个[a,b]之间的随机浮点数
choice(seq)从序列seq中随机选择一个元素
shuffle(seq)打乱序列seq并返回打乱后的新序列

3.1.1 例10.11:random模块的使用

import random
# 设置种子
random.seed(10)
print(random.random())
print(random.random()) # [0,1), float
# 因为随机种子固定,重复运行此两行,所得随机数相同
# 按住Ctrl点选random,可从标准库文档中查看所调用的函数
print('-'*20)

random.seed(10)
print(random.randint(1,100)) # [1,100], integer

for i in range(10): # 取10次随机数
    print(random.randrange(1,10,3)) # [1,10), integer, step=3
    
print(random.uniform(1,100)) # [1,100], float

lst=[for i in range(1,11)]
print(random.choice(lst)) # 随机从lst取一个元素

random.shuffle(lst)
print(lst)

random.shuffle(lst)
print(lst) # 两次结果不一样

3.2 time模块

3.2.1 函数

函数名称说明
time()获取当前时间戳
localtime(sec)获取指定时间戳对应的本地时间的$\verbstruct_time
$对象
ctime()获取当前时间戳对应的易读字符串
strftime()格式化时间,结果为字符串 str→string; ft→format
strptime()提取字符串的时间,结果为$\verbstruct_time
$对象
sleep(sec)休眠$\verbsec$秒

3.2.2 格式化字符串(formatted string)

格式化字符串说明取值范围
$\verb%Y$年份0001-9999
$\verb%m$月份01-12
$\verb%B$月名January-December
$\verb%d$日期01-31
$\verb%A$星期Monday-Sunday
$\verb%H$小时(24h制)00-23
$\verb%I$小时(12h制)01-12
$\verb%M$分钟00-59
$\verb%S$00-59

3.2.3 例10.12:time模块的使用

import time
now=time.time()
print(now) # 输出时间戳

obj=time.localtime()
print(obj) # 输出struct_time对象

obj2=time.localtime(60)
print(type(obj2),obj2) # 时间戳为60时,输出为1970/1/1 GMT+8 8:01
print('Year:',obj2.tm_year)
print('Month:',obj2.tm_mon)
print('Date:',obj2.tm_mday)
print('Hour:',obj2.tm_hour)
print('Min:',obj2.tm_min)
print('Second:',obj2.tm_sec)
print('Weekday:',obj2.tm_wday) # 取值[0,6],因此2表示星期三
print('Day of the year:',obj2.tm_yday) # 今年第几天
print(time.ctime()) # ctime-->易读字符串

# 日期时间格式化
print(time.strftime('%Y-%m-%d',time.localtime()))
print(time.strftime('%H:%M:%S',time.localtime()))
print(time.strftime('%B',time.localtime())) # 月份名称
print(time.strftime('%A',time.localtime())) # 星期名称

# 字符串转回struct_time对象
print(time.strptime('2008-08-08','%Y-%m-%d')

# 程序暂停秒数
time.sleep(20)
print('helloworld')

3.3 datetime模块

类名说明
datetime.datetime表示日期时间的类
datetime.timedelta表示时间间隔的类 注意:年、月不可计算
datetime.date表示日期的类
datetime.time表示时间的类
datetime.tzinfo时区相关的类
datetime子类的函数说明
datetime(y,m,d,h,m,s)通过传入参数创建包含从年到秒的datetime对象
datetime.now()获取当前时间
timedelta子类的函数说明
timedelta(d,sec)通过传入参数创建timedelta对象

3.3.1 例10.13:datetime类的使用

from datetime import datetime
dt=datetime.now() # 获取当前系统时间
print(dt)

# 手动创建对象
dt2=datetime(2077,1,14,16,35)
print(type(dt2),dt2) # 类型为class
print(dt2.year,dt2.month,dt2.day) # 年月日时分秒都可以取出

# 比大小
d1=datetime(2028,5,1,0,0,0)
d2=datetime(2028,10,1,0,0,0)
print('2028/5/1 earlier than 2028/10/1?',d1<d2)

# datetime class -> str
nwt=datetime.now()
print(type(nwt)) # 验证nwt为class
nwt_str=nwt.strftime('%Y/%m/%d %H:%M:%S')
print(type(nwt_str)) # 验证nwt_str为str

# datetime str -> class
str_time='2077/7/7 07:07:07'
d3=datetime.strptime(str_time,'%Y/%m/%d %H:%M:%S')
print(type(str_time),str_time) # 验证
print(type(d3),d3) # 验证d3为class和d3的数据

3.3.2 例10.14:timedelta类的使用

from datetime import datetime
from datetime import timedelta
# 进行datetime类型之间的算术运算
delta1=datetime(2028,10,1)-datetime(2028,5,1)
print(type(delta1),delta1) # 153 days, 0:00:00
print('validation',datetime(2028,5,1)+delta1)

# 通过传入参数创建timedelta对象
dt1=timedelta(10)
print('a 10-day timedelta obj:',dt1) # 创建10天的timedelta对象

4 常用第三方库

4.1 requests模块(处理HTTP请求/爬虫)

4.1.1 简介

  • 用于处理超文本传输协议(HTTP)请求的第三方库,该库在爬虫(web crawlers)中应用广泛。
  • 使用requests库中的get()函数可以打开一个网络请求,并获取一个$\verb|Response|$响应对象。
  • 响应结果中有字符串数据也有二进制数据(如图片、音频、视频等),前者可以通过响应对象的$\verb|text|$属性获取,后者可以通过响应对象的$\verb|content|$属性获取。

4.1.2 函数

函数说明
get()打开一个网络请求,并获取一个$\verbResponse$响应对象

4.1.3 例10.15:爬取“中国天气网”中“景点推荐”模块的天气数据

import requests
import re # 正则表达式模块
url1='http://www.weather.com.cn/weather1d/101120101.shtml'
resp_obj=requests.get(url1) # 获取一个响应对象,定义为resp_obj
resp_obj.encoding='utf-8' # 设置编码格式
print(resp_obj.text) # 对象名.属性名,可获取html语言格式的网页内容

# 进一步使用正则表达式提取对象
city=re.findall('<span class="name">([\u4e00-\u9fa5]*)</span>',resp_obj.text)
weather=re.findall('<span class="weather">([\u4e00-\u9fa5]*)</span>',resp_obj.text)
temperature=re.findall('<span class="wd">(.*)</span>',resp_obj.text)
situation=re.findall('<span class="zs">([\u4e00-\u9fa5]*)</span>',resp_obj.text)
print('二维列表')
print(city)
print(weather)
print(temperature)
print(situation)

lst=[] # 使用列表打包数据
for a,b,c,d in zip(city,weather,temperature,situation):
    lst.append([a,b,c,d])
print('一维数据')
print(lst)

4.1.4 例10.16:爬取百度的Logo图片

import requests
url='https://www.baidu.com/img/PCfb_5bf082d29588c07f842ccde3f97243ea.png'

r=requests.get(url)

# 保存到本地
with open('logo.png','wb')as file1: # 二进制文件,使用with()覆写
    file1.write(r.content)

4.2 openpyxl模块(写入/读取Excel数据,自动化办公)

4.2.1 简介

  • 用于处理Microsoft Excel文件的第三方库。
  • 可以对Excel文件中的数据进行写入和读取。

4.2.2 函数

函数说明
load\_workbook(filename)打开已存在的表格,结果为工作簿对象
workbook.sheetnames工作簿对象的sheetnames属性,用于获取所有工作表的名称,结果为列表类型
sheet.append(lst)向工作表中(末尾)添加一行数据
workbook.save(excelname)保存工作簿
Workbook()创建新的工作簿对象

4.2.3 例10.18:把上例天气数据存储至Excel中

# weather.py
# 封装
import requests
import re # 正则表达式模块

def get_html():
    
    url1='http://www.weather.com.cn/weather1d/101120101.shtml'
    resp_obj=requests.get(url1) # 获取一个响应对象,定义为resp_obj
    resp_obj.encoding='utf-8' # 设置编码格式
    return resp_obj.text
    
def parse_html(h_str):
    # 进一步使用正则表达式提取对象
    city=re.findall('<span class="name">([\u4e00-\u9fa5]*)</span>',h_str)
    weather=re.findall('<span class="weather">([\u4e00-\u9fa5]*)</span>',h_str)
    temperature=re.findall('<span class="wd">(.*)</span>',h_str)
    situation=re.findall('<span class="zs">([\u4e00-\u9fa5]*)</span>',h_str)
    
    lst=[] # 使用列表打包数据
    for a,b,c,d in zip(city,weather,temperature,situation):
        lst.append([a,b,c,d])
    return lst
import weather
import openpyxl

html=weather.get_html() # 发请求,得响应结果
lst=weather.parse_html(html) # 解析数据

# 创建新工作簿
workbook=openpyxl.Workbook()
# 创建工作表
sheet=workbook.create_sheet('景区天气')
# 添加数据
for item in lst:
    sheet.append(item) # 循环一次添加一行
    
workbook.save('景区天气.xlsx')

4.2.4 例10.19:从Excel中读取数据

import openpyxl
# 打开工作簿
wb=openpyxl.load_workbook('景区天气.xlsx')
# 选择要操作的工作表
sheet=wb['景区天气']
# 先遍历行,后遍历列
lst=[] # 存储行数据
for row in sheet.rows:
    sublst=[] # 存储单元格数据
    for cell in row:
        sublst.append(cell.value)
    lst.append(sublst)
for item in lst:
    print(item)

4.3 pdfplumber模块(读取PDF内容,自动化办公)

4.3.1 简介

pdfplumber模块可用于从PDF文件中读取内容。

4.3.2 例10.20:从pdf提取数据

import pdfplumber
with pdfplumber.open('1.pdf') as file1:
    for i in file1.pages:
        print(i.extract_text()) # extract_text()方法提取内容
        print(f'-------------第{i.page_number}页提取完成')

4.4 Numpy模块

4.4.1 简介

Numpy是Python数据分析方向和其他库的依赖库,用于处理数组、矩阵等数据。

Numpy也可以用来处理图片。

4.4.2 例10.21:图像的灰度处理

import numpy as np
import matplotlib as plt
# 读取图片
n1=plt.imread('google_logo.png') 
# 输出为三维数组,最高维度表示图片的高度,次高维度表示宽度,最低维度是RGB
plt.imshow(n1)

# 编写一个灰度公式
n2=np.array([0.299,0.587,0.114]) # 创建数组
# n1(RGB)与n2(灰度)点乘运算
x=np.dot(n1,n2)
# 传入数组,显示灰度
plt.imshow(x,cmap='gray')
# 显示图像
plt.show()

4.5 Pandas模块和Matplotlib模块

4.5.1 简介

  1. Pandas是基于Numpy模块扩展的一个非常重要的数据分析模块,使用Pandas读取Excel数据更加方便。
  2. Matplotlib是用于数据可视化的模块,使用$\verb|Matplotlib.pyplot|$可以便捷绘制饼图、柱形图、折线图等。

4.5.2 例10.22:绘制饼图

import pandas as pd
import matplotlib.pyplot as plt

# 读取Excel文件
df = pd.read_excel('JD销售数据.xlsx')

# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 设置画布大小
plt.figure(figsize=(10, 6))

# 提取数据
labels = df['商品名称']
y = df['北京出库销量']

# 绘制饼图
plt.pie(y, labels=labels, autopct='%1.1f%%', startangle=90)

# 设置x/y轴刻度
plt.axis('equal')

# 设置标题
plt.title('JD销量(北京)各品牌占比')

# 显示图表
plt.show()

4.6 PIL/pillow模块(模糊图像)

4.6.1 简介

用于图像处理的第三方库,它支持图像存储、处理和显示等操作。

# 安装时,模块名字为“pillow”
pip install pillow
# 调用时,模块名字为“PIL”
from PIL import Image

4.7 jieba模块(中文分词)

4.7.1 简介

用于对中文进行分词。

4.8 PyInstaller模块(打包源文件)

最后修改:2024 年 07 月 03 日
喵~