1.模块和包
1.1什么是模块
在计算机程序的开发过程中,随着程序代码越写越多,在⼀一个⽂文件⾥里里代码就会越来越⻓长,越来越不不容易维护。
为了了编写可维护的代码,我们把很多代码按功能分组,分别放到不不同的⽂文件⾥里里,这样,每个文件包含的代码就相对较少,很多编程语⾔言都采⽤用这种组织代码的⽅方式。在Python中,一个.py⽂文件就可以称之为一个模块(Module)。
使⽤用模块有什什么好处?
- 最大的好处是大提⾼高了了代码的可维护性。其次,编写代码不不必从零开始。一个模块编写完毕,就可以被其他地方引⽤用。我们在编写程序的时候,也经常引⽤用其他模块,包括Python内置的模块和来⾃自第三⽅方的模块。
- 使⽤用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以,我们自己在编写模块时,不必考虑名字会与其他模块冲突。
模块分类
模块分为三种:
- 内置标准模块(⼜又称标准库)执行行help(‘modules’)查看所有python⾃自带模块列列表
- 第三⽅方开源模块,可通过pip install 模块名 联⽹网安装
- ⾃自定义模块
模块导⼊入&调⽤
import module_a #导⼊入 from module import xx # 导⼊入某个模块下的某个⽅方法 or ⼦子模块 from module.xx.xx import xx as rename #导⼊入后⼀一个⽅方法后重命令 from module.xx.xx import * #导⼊入⼀一个模块下的所有⽅方法,不不建议使⽤用 module_a.xxx #调⽤用
调用一个模块,就相当于执行了一次.py文件
1.2自定义模块
这个最简单, 创建⼀一个.py⽂文件,就可以称之为模块,就可以在另外⼀一个程序⾥里里导⼊。
1.3模块的查找路径
有没有发现,自己写的模块只能在当前路径下的程序里才能导⼊入,换一个目录再导⼊入自己的模块就报错说找不不到了了, 这是为什么?
这与导⼊入模块的查找路路径有关。
import sys print(sys.path)
输出:
[‘D:\develop\py\pythonProject’, ‘D:\develop\py\pythonProject’, ‘D:\apply\jetbrains\PyCharm 2024.1.4\plugins\python\helpers\pycharm_display’, ‘C:\Program
Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.179.0_x64__qbz5n2kfra8p0\python313.zip’, ‘C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.179.0_x64__qbz5n2kfra8p0\DLLs’, ‘C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.179.0_x64__qbz5n2kfra8p0\Lib’, ‘C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.13_3.13.179.0_x64__qbz5n2kfra8p0’, ‘D:\develop\py\pythonProject\venv’, ‘D:\develop\py\pythonProject\venv\Lib\site-packages’, ‘D:\apply\jetbrains\PyCharm 2024.1.4\plugins\python\helpers\pycharm_matplotlib_backend’]
你导⼊入一个模块时,Python解释器器会按照上⾯面列列表顺序去依次到每个⽬录下去匹配你要导⼊入的模块名,只要在⼀一个⽬目录下匹配到了了该模块名,就⽴立刻导⼊,不再继续往后找。
1.3 第3方开源模块安装
https:/pypi.python.org/pypi 是pythoni的开源模块库,截止2020年5.26日,已经收录了236,269个来
自全世界python开发者贡献的模块,几乎涵盖了你想用oython做的任何事情。事实上每个oython开发者,只要注册一个账号就可以往这个平台上传你自己的模块,这样全世界的开发者都可以容易的下载并使用你的模块。
那如何从这个平台上下载代码呢?
- 直接在上面这个页面上点download,下载后,解压并进入目录,执行以下命令完成安装。
编译源码 python setup.py build 安装源码 python setup.py install
- 直接通过pip安装
pip3 install paramiko #paramiko 是模块名
1.4 什么是包(package)
若你写的项目较复杂,有很多代码文件的话,为了方便管理,可以用包来管理。一个包其实就是一个文件目录,你可以把属于同一个业务线的代码文件都放在同一个包里。
如何创建一个包?
只需要在目录下创建一个空的init·py文件,这个目录就变成了包。这个文件叫包的初始化文件
,一般为空,当然也可以写东西,当你调用这个包下及其任意子包的的任意模块时,这
个init·py文件都会先执行。
2.几个常用的python模块
2.1 系统调用OS模块
os 模块提供了很多允许你的程序与操作系统直接交互的功能。
得到当前⼯工作⽬目录,即当前Python脚本⼯工作的⽬目录路路径: os.getcwd() 返回指定⽬目录下的所有⽂文件和⽬目录名:os.listdir() 函数⽤用来删除⼀一个⽂文件:os.remove() 删除多个⽬目录:os.removedirs(r“c:\python”) 检验给出的路路径是否是⼀一个⽂文件:os.path.isfile() 检验给出的路路径是否是⼀一个⽬目录:os.path.isdir() 判断是否是绝对路路径:os.path.isabs() 检验给出的路路径是否真地存:os.path.exists() 返回⼀一个路路径的⽬目录名和⽂文件名:os.path.split() e.g os.path.split('/home/swaroop/byte/code/poem.txt') 结果: ('/home/swaroop/byte/code', 'poem.txt') 分离扩展名:os.path.splitext() e.g os.path.splitext('/usr/local/test.py') 结果:('/usr/local/test', '.py') 获取路路径名:os.path.dirname() 获得绝对路路径: os.path.abspath() 获取⽂文件名:os.path.basename() 运⾏行行shell命令: os.system() 读取操作系统环境变量量HOME的值:os.getenv("HOME") 返回操作系统所有的环境变量量: os.environ 设置系统环境变量量,仅程序运⾏行行时有效:os.environ.setdefault('HOME','/home/alex') 给出当前平台使⽤用的⾏行行终⽌止符:os.linesep Windows使⽤用'\r\n',Linux and MAC使⽤用'\n' 指示你正在使⽤用的平台:os.name 对于Windows,它是'nt',⽽而对于Linux/Unix⽤用户,它 是'posix'
2.2time模块
在平常的代码中,我们常常需要与时间打交道。在Python中,与时间处理有关的模块就包括:time,
datetime,calendar(很少用,不讲),下面分别来介绍。
我们写程序时对时间的处理可以归为以下3种:
时间的显示,在屏幕显示、记录日志等"2022-03-04”
时间的转换,比如把字符串格式的日期转成Python中的日期类型
时间的运算,计算两个日期间的差值等。
在Python中,通常有这⼏种⽅方式来表示时间:
- 时间戳(timestamp),表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。例子:1554864776.161901
- 格式化的时间字符串,比如"2020-10-0317:54”"
- 元组(struct_time)共九个元素。由于Pythont的time模块实现主要调用C库,所以各个平台可能有所不同,
2.3datetime模块
相比于time模块,datetime模块的接口则更直观、更容易调用。
datetime模块定义了下面这几个类:
- datetime.date:表示日期的类。常用的属性有year,month,day;
- datetime.time:表示时间的类。常用的属性有hour,minute,second,microsecond;
- datetime.datetime:表示日期时间。
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
- datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的可以参考python手册)
2.4 random随机数
程序中有很多地方需要用到随机字符,比如登录网站的随机验证码,通过random模块可以很容易生成随机字符串:
>>> random.randrange(1,10) #返回1-10之间的⼀一个随机数,不不包括10 >>> random.randint(1,10) #返回1-10之间的⼀一个随机数,包括10 >>> random.randrange(0, 100, 2) #随机选取0到100间的偶数 >>> random.random() #返回⼀一个随机浮点数 >>> random.choice('abce3#$@1') #返回⼀一个给定数据集合中的随机字符 '#' >>> random.sample('abcdefghij',3) #从多个字符中选取特定数量量的字符 ['a', 'd', 'b'] #⽣生成随机字符串串 >>> import string >>> ''.join(random.sample(string.ascii_lowercase + string.digits, 6)) '4fvda1' #洗牌 >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> random.shuffle(a) >>> a [3, 0, 7, 2, 1, 6, 5, 8, 9, 4]
2.5 序列化json模块
SON)avaScriptObject Notation,JS对象简谱)是一种轻量级的数据交换格式。它采用完全独立于编程
语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得jSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
Json的作用是用于不同语言接口间的数据交换,比如你把python的list、dict直接扔给javascript,它是解析不了的。2个语言互相谁也不认识。Jso门就像是计算机界的英语,可以帮各个语言之间实现数据类型的相互转换。
- json,用于字符串和python数据类型间进行转换
- pickle,用于oython特有的类型和python的数据类型间进行转换
pickle
模块提供了了四个功能:dumps、dump、loads、load
import pickle data = {'k1':123,'k2':'Hello'} # pickle.dumps 将数据通过特殊的形式转换位只有python语⾔言认识的字符串串 p_str = pickle.dumps(data) # 注意dumps会把数据变成bytes格式 print(p_str) # pickle.dump 将数据通过特殊的形式转换位只有python语⾔言认识的字符串串,并写⼊入⽂文件 with open('result.pk',"wb") as fp: pickle.dump(data,fp) # pickle.load 从⽂文件⾥里里加载 f = open("result.pk","rb") d = pickle.load(f) print(d)
json
Json模块也提供了四个功能:dumps、dump、loads、load,用法跟pickle-一致
import json # json.dumps 将数据通过特殊的形式转换位所有程序语⾔言都认识的字符串串 j_str = json.dumps(data) # 注意json dumps⽣生成的是字符串串,不不是bytes print(j_str) #dump⼊入⽂文件 with open('result.json','w') as fp: json.dump(data,fp) #从⽂文件⾥里里load with open("result.json") as f: d = json.load(f) print(d)
2.6 Excel处理模块
第3方开源模块,安装:
pip install openpyxl
2.6.1 打开文件
创建
from openpyxl import Workbook # 实例例化 wb = Workbook() # 获取当前active的sheet ws = wb.active print(sheet.title) # 打印sheet表名 sheet.title = "salary luffy" # 改sheet 名
打开已有文件
from openpyxl import load_workbook wb2 = load_workbook('⽂文件名称.xlsx')
2.6.2写数据
# ⽅方式⼀一:数据可以直接分配到单元格中(可以输⼊入公式) sheet["C5"] = "Hello ⾦金金⻆角⼤大王" sheet["C7"] = "Hello ⾦金金⻆角⼤大王2" # ⽅方式⼆二:可以附加⾏行行,从第⼀一列列开始附加(从最下⽅方空⽩白处,最左开始)(可以输⼊入多⾏行行) sheet.append([1, 2, 3]) # ⽅方式三:Python 类型会被⾃自动转换 sheet['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
2.6.3 选择表
# sheet 名称可以作为 key 进⾏行行索引 ws3 = wb["New Title"] ws4 = wb.get_sheet_by_name("New Title") print(wb.get_sheet_names()) # 打印所有的sheet sheet = wb.worksheets[0] # 获得第1个sheet
2.6.4保存表
wb.save('⽂文件名称.xlsx')
2.6.5遍历表数据
按⾏遍历
for row in sheet: # 循环获取表数据 for cell in row: # 循环获取每个单元格数据 print(cell.value, end=",") print()
按列遍历
# A1, A2, A3这样的顺序 for column in sheet.columns: for cell in column: print(cell.value,end=",") print()
指定行和列
# 从第2⾏行行开始⾄至第5⾏行行,每⾏行行打印5列列 for row in sheet.iter_rows(min_row=2,max_row=5,max_col=5): for cell in row: print(cell.value,end=",") print()
2.6.6 删除工作表
# ⽅方式⼀一 wb.remove(sheet) # ⽅方式⼆二 del wb[sheet]
2.6.7导入单元格样式
一、需要导入的类
from openpyxl.styles import Font, colors, Alignment • 1
二、字体
下面的代码指定了等线24号,加粗斜体,字体颜色红色。直接使用cell的font属性,将Font对象赋值给它。
bold_itatic_24_font = Font(name='等线', size=24, italic=True, color=colors.RED, bold=True) # 声明样式 sheet['A1'].font = bold_itatic_24_font # 给单元格设置样式
三、对齐方式
也是直接使用cell的属性aligment,这里指定垂直居中和水平居中。除了center,还可以使用right、Ieft
等等参数。
# 设置B1中的数据垂直居中和⽔水平居中 sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')
四、设置行高和列宽
# 第2⾏行行⾏行行⾼高 sheet.row_dimensions[2].height = 40 # C列列列列宽 sheet.column_dimensions['C'].width = 30