基本扩展模块

343 阅读11分钟

基本扩展模块的相关知识,内容包括 datetime 模块、calender 模块、time 模块、几个算数模块、持久化模块、文本文件读写、简单的图形界面、海龟绘图、上机练习。

一、datetime 模块

1. 主要的类

可对date、time、datetime三种时间模式进行单独管理

  1. datetime.date() 处理日期(年月日)
  2. datetime.time() 处理时间(时分秒、毫秒)
  3. datetime.datetime() 处理日期+时间
  4. datetime.timedelta() 处理时段(时间间隔)

2. 获取当前时间

获取今天的日期

datetime.date.today()
datetime.datetime.now()

修改日期格式

  • 使用strftime格式化
  • datetime.datetime.isoformat()

3. 时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总秒数

将日期转换成时间戳

  • timetuple函数 -- 将时间转换成struct_time格式
  • time.mktime函数 -- 返回用秒数来表示时间的浮点数

将时间戳转换成日期

datetime.date.fromtimestamp()

4. 时间上的加减法

timedelta()方法

  • 表示两个时间点的间隔

二、calender 模块

1. 制作电子日历

calendar模块

  • 跟日历相关的若干函数和类,可以生成文本形式的日历

常用函数

calendar.calendar(<年>)
calendar.month(<年>,<月>)
calendar.prmonth(<年>,<月>)
calendar.prcal(<年>)

2. 制作电子日历:一个月

calendar.month(<年>,<月>)

  • 返回多行字符串 calendar.prmonth(<年>,<月>)
  • 相当于print (calendar.month (<年>,<月>))

3. 制作电子日历:一整年

calendar.calendar(<年>)

  • 返回多行字符串

calendar.prcal(<年>)

  • 相当于print (calendar.prcal (<年>))

4. 将日历列表化

calendar.monthcalendar()

  • 返回某一年的某一个月份日历,是一个嵌套列表
  • 最里层的列表含有七个元素,代表一周(从周一到周日)
  • 如果没有本月的日期,则为0

5. 与日历相关的计算

判别闰年

  • 普通闰年:能被4整除但不能被100整除的年份
  • 世纪闰年:能被400整除的年份
calendar.isleap(<年>)

计算某月共有多少天,从周几开始

  • 从0开始,依次为周一、周二… 计算某天是周几
  • 返回值为0~6,依次对应的是周一到周日

三、time 模块

1. 获取时间戳

time.time()方法,时间戳的用处

2. 获取日期格式

获取当前时间

time.asctime()
time.ctime()
out:'Mon Aug 13 16:01:27 2018'

将元组数据转化为日期

t = (2018, 8, 13, 11, 42, 31, 0, 0, 0)
time.asctime(t)
out:'Mon Aug 13 11:42:31 2018'

这一系列的数值分别对应年、月、日、时、分、秒、周几、一年中的第几天、是否为夏令时间。

3. 利用索引获取时间信息

struct_time类

time.localtime()
Out:time.struct_time(tm_year=2018, tm_mon=8, tm_mday=13,tm_hour=12, 
tm_min=24, tm_sec=11, tm_wday=0, tm_yday=225, tm_isdst=0)

索引获取时间信息

t = time.localtime()
year = t[0]
out:2018

4. 让程序睡一会

让程序运行到某处便暂停几秒

time.sleep()

四、几个算数模块

1. math模块

math模块支持浮点数运算

math.sin()/math.cos()/math.tan()
math.pi          Π = 3.14159…
math.log(x,a)    以a为底的x的对数
math.pow(x,y)    x^y

cmath模块支持复数运算

cmath.polar()      极坐标
cmath.rect()       笛卡尔坐标
cmath.exp(x)       e^x
cmath.log(x,a)     以a为底的x的对数
cmath.log10(x)     以10为底x的对数
cmath.sqrt(x)      x的平方根。

2. decimal模块

小数-固定精度的浮点值

  • 0.1+0.1+0.1-0.3=5.551115123125783e-17

生成小数

from decimal import Decimal 
Decimal('0.1')

小数计算

Decimal('0.1')+Decimal('0.1')+Decimal('0.1
0')-Decimal('0.3')
Out:Decimal('0.00')

3. fractions模块

分数-实现了一个有理数对象

生成分数

from fractions import Fraction
Fraction(1,4)/Fraction('0.25')

浮点数转换为分数

Fraction.from_float(1.75)

尽管可以把浮点数转换为分数,在某些情况下,这么做会有不可避免的精度损失,因为这个数字在其最初的浮点形式上是不精确的

4. random模块

伪随机数

  • 计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可预见的

随机数种子

  • 随机种子相同,随机数的序列也是相同的
random.seed(a=None)
  1. random(),生成范围在[0,1)之间的随机实数
  2. uniform(),生成指定范围的内的随机浮点数
  3. randint(m,n),生成指定范围[m,n]内的整数
  4. randrange(a,b,n),可以在[a,b)范围内,按n递增的集合中随机选择一个数
  5. getrandbits(k),生成k位二进制的随机整数
  6. choice(),从指定序列中随机选择一个元素
  7. sample(),能指定每次随机元素的个数
  8. shuffle(),可以将可变序列中所有元素随机 排序

五、持久化模块

1. 对象持久化

临时性对象

  • 类创建的对象并不是真正的数据库记录
  • 存储在内存而不是文件中 *关闭python,实例将消失

对象持久化

  • 对象在创建它们的程序退出之后依然存在

标准库模块

  • pickle -- 任意Python对象格式化和解格式化
  • dbm -- 实现一个可通过键访问的文件系统,以存储字节串
  • shelve -- 按照键把pickle处理后的对象存储到一个文件中

2. 构造数据库

shelve模块

  • 提供基本的存储操作,通过构造一个简单的数据库,像操作字典一样按照键存储和获取本地的Python对象,使其可以跨程序运行而保持持久化

键 -- 必须是字符串,且是唯一的

值 -- 任何类型的Python对象

3. 构造数据库

与字典类型的区别

  • 一开始必须打开shelve,并且在修改后需要关闭它

数据处理

  • 不支持类似SQL的查询工具
  • 但只要通过键获取到保存在文件的对象,就可以像正常的数据对象一样处理

4. 常用操作

将任何数据对象,保存到文件中去

d = shelve.open(filename)
  • open函数在调用时返回一个shelf对象,通过该对象可以存储内容

类似字典形式访问,可读可写

d[key] = data
value = d[key]
del d[key]

操作完成后,记得关闭文件

d.close()

六、文本文件读写

1. 文件的打开

普通文件

  • 数据持久化的最简单类型
  • 仅仅是在一个文件名下的字节流,把数据从文件读入内存,从内存写入文件

open()函数

f = open(filename[,mode[,buffering]])
  • f: open()返回的文件对象
  • filename:文件的字符串名
  • mode:可选参数,打开模式和文件类型
  • buffering: 可选参数,文件的缓冲区,默认为-1

2. 文件的打开模式

mode第一个字母表明对其的操作:

  • ‘r’表示读模式
  • ‘w’表示写模式
  • ‘x’表示在文件不存在的情况下新创建并写文件
  • ‘a’表示在文件末尾追加写内容
  • ‘+’表示读写模式

mode第二个字母是文件类型

  • ‘t’表示文本类型
  • ‘b’表示二进制文件

3. 文件的读写和访问

文件的写操作

f.write(str)
f.writelines(strlist):写入字符串列表

文件的读操作

f.read()
f.readline():返回一行
f.readlines():返回所有行、列表

4. 文件的关闭

文件打开后要记得关闭

  • 关闭的作用是终止对外部文件的连接,同时将缓存区的数据刷新到硬盘上

调用close()方法

f.close()

使用上下文管理器(context manager)

  • 确保在退出后自动关闭文件
with open(‘textfile’,’rt’) as myfile:
myfile.read()

5. 结构化文本文件:CSV

纯文本文件,以“,”为分隔符

  • 值没有类型,所有值都是字符串
  • 不能指定字体颜色等样式
  • 不能指定单元格的宽高,不能合并单元格
  • 没有多个工作表
  • 不能嵌入图像图表

文件读取 - reader

re = csv.reader()
  • 接受一个可迭代对象(比如csv文件),能返回一个生成器,可以从其中解析出内容

文件读取 - DictReader

re = csv.DictReader()
  • 与reader类似
  • 但返回的每一个单元格都放在一个元组的值内

文件写操作

w = csv.writer()
w.witerow(rows)
  • 当文件不存在时,自动生成
  • 支持单行写入和多行写入

字典数据写入

w = csv.DictWriter()
w.writeheader()
w.writerow(rows)

6. 结构化文本文件:Excel

penpyxl 模块

  • 用来读写扩展名为xlsx/xlsm/xltx/xltm的文件
  • Workbook类是对工作簿的抽象
  • Worksheet类是对表格的抽象
  • Cell类是对单元格的抽象文件写操作

操作之前先导入第三方库

  • 安装: pip install openpyxl
  • 导库: from openpyxl import workbook

创建Excel文件

  • 一个Workbook对象代表一个Excel文档,使用该方法创建一个Worksheet对象后才能打开一个表
from openpyxl import Workbook
wb = Workbook()
ws = wb.active

读取Excel文件

from openpyxl import load_workbook
wb = load_workbook(filename)
ws = wb.file.active

获取单元格信息

  • 获取Cell对象
c = wb[‘sheet’][‘A1’]
c = wb[‘sheet’].cell(row=1,column=1)
  • c.coordinate : 返回单元格坐标
  • c.value : 返回单元格的值
  • c.row : 返回单元格所在的行坐标
  • c.column : 返回单元格所在列坐标

7. 结构化文本文件:PDF

轻松处理pdf文件的库 – PyPDF2

  • 包含了PdfFileReader、PdfFileMerger、PageObject和PdfFileWriter四个主要类
  • 能进行读写、分割、合并、文件转换等多种操作
  • 只能从PDF文档中提取文本并返回为字符串,而无法提取图像、图表或其他媒体

读取PDF文件

readFile = open('test.pdf','rb')
pdfFileReader = PdfFileReader(readFile)

pdfFileReader类

  • .getNumPages():计算PDF文件总页数
  • .getPage(index):检索指定编号的页面

PDF文件的写操作

writeFile = 'output.pdf'
pdfFileWriter = PdfFileWriter()

〉 pdfFileWriter类

  • .addPage(pageObj):根据每页返回的 PageObject,写入到文件
  • .addBlankPage():在文件的最后一页后面写入一个空白页,保存到新文件

合并多个文档

pdf_merger = PdfFileMerger()
pdf_merger.append('python2018.pdf')
pdf_merger.merge(20, 'insert.pdf')
pdf_merger.write('merge.pdf')

单个页面操作 – PageObject类

  • .extractText():按照顺序提取文本
  • .getContents():访问页面内容
  • .rotateClockwise(angle):顺时针旋转
  • .scale(sx,sy):改变页面大小

七、简单的图形界面

1. 图形用户界面

图形用户界面(GUI)

  • GUI是人机交互的图形化界面设计,包括展示数据用的小控件、输入的方法、菜单、按钮以及窗口等
  • 用户通过鼠标、键盘等输入设备操纵屏幕上的图标或菜单选项,来执行选择命令、调用文件、启动程序等日常任务

easygui模块

  • 可以显示各种对话框、文本框、选择框与用户交互
  • 功能演示
easygui.egdemo()

2. easygui常用函数

消息窗口

easygui.msgbox()
  • 显示一条消息和提供一个"OK"按钮
  • 用户可以指定任意的消息和标题,甚至重写"OK"按钮的内容

按钮选项

easygui.choicebox()
  • 为用户提供了一个可选择的列表,使用序列(元祖或列表)作为选项

显示文本

easygui.textbox()
  • 用于显示文本内容
  • text参数可以是字符串、列表或元组类型

输入密码

easygui.passwordbox()
  • 类似于enterbox(),但是用户输入的内容是用"*"显示出来

打开文件

easygui.fileopenbox()
  • 返回用户选择的文件名(带完整路径)
  • Default参数指定了一个默认路径

八、海龟绘图

1. 海龟作图的基本方法

turtle模块

  • 内置模块,从LOGO语言借鉴而来
  1. 属性 -- 位置、方向、画笔(颜色、线条宽度等)
  2. 指令 -- 画笔运动命令,前/后移动、左/右转动、作画速度等
  3. 画笔控制命令 -- 抬起/放下、画笔宽度、画笔颜色、填充颜色等

2. 绘制简单图形

画直线

画正方形

画多边形

画五角星

3. 绘制树形图

调用递归画树

先画树干,再画右树枝,最后画左树枝:与递归函数里的流程一致

4. 绘制分形图

分形(fractal)的基本概念 -- 部分与整体以某种方式相似的形体

“分形学之父” -- 数学家曼德勃罗(Benoit B. Mandelbrot)

  1. 分形图:曼德勃罗集

  1. 自相似分形曲线

  1. Hilbert曲线
  • 空间填充曲线,可以线性地贯穿二维或者更高维度的每个离散单元并进行排序和编码
  • 可用于将高维空间中没有良好顺序的数据映射到一维空间

  1. 谢尔宾斯基三角形
  • 由3个相同的谢尔宾斯基三角形按照品字形拼叠而成
  • 面积为0,周长为无穷大
  • 我们只能画出维数(degree)有限的近似图形

九、上机练习

1. 给算法计时

看看阶乘累加(n=1~100)各需要多长时间?

2. 文件处理:文本文件写入

将一篇文章写入一个文本文件

3. 文件处理:文本文件读取

读出文本文件,统计单词数输出

读出文本文件,随机输出其中的10个单词

4. 利用turtle模块,进行图形绘制

选择“正方形”,绘制一个边长100的绿色正方形

选择“五角星”,绘制一个边长100的红色五角星

5. 调用turtle模块画一棵树

包括枝干和树叶,并涂上颜色

「资料来源:Python语言基础与应用-陈斌」