11 模块

模块英文为Modules, 使用模块的好处:

  • 方便其它程序和脚本的导入并使用。
  • 避免函数名和变量名冲突。
  • 提高代码的可维护性。
  • 提高代码的可重用性。

新建一个.py文件,名称尽量不要与Python自带的标准模块名称相同。

Python中的包:

  • 通过 import 的方式进行导入时 ,只能跟包和模块名,在访问时需要加相应的前缀,如“m2.”。            举例:import  m2 ,print : ( m2.X )
  • 使用 from......import可以导入包、模块、函数、变量

安装模块:

  • windows + r      再执行 cmd
  • 命令: pip install 模块名
  • 再执行:python
  • 测试:import 模块名

11.1 数学计算模块——math

在math模块中包含数学运算相关的函数等,例如指数、对数、平方根和三角函数等。

11.2 日期时间模块——datetime

  • datetime:包含时间和日期。
  • date:只包含日期。
  • time:只包含时间。
  • timedelta:计算时间跨度。
  • tzinfo:时区信息。
  • 去掉毫秒的方式     # now_time = datetime.datetime.today().replace(microsecond=0)

11.2.1 datetime类

datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None).

datetime类表示日期和时间等信息,

  • datetime.today():返回当前的本地日期和时间。
  • datetime.now(tz=None):返回指定时区的当前日期和时间,参数tz用于设置时区,如果参数tz为None或省略,则等同于today()。
  • datetime.fromtimestamp(timestamp,tz=None):返回与UNIX时间戳对应的本地日期和时间。UNIX时间戳是从1970年1月1日00:00:00开始到现在为止的总秒数。我们在Python Shell中运行代码,看看运行结果怎样。
import datetime
d = datetime.datetime.today()
print(d)   # 2023-01-31 12:10:14.268555
print(d.strftime('%Y-%m-%d %H:%M:%S'))   # 2023-01-31 12:10:14
print(d.strftime('%Y-%m-%d'))   # 2023-01-31
str_date = '2020-02-29 10:40:26'
date = datetime.datetime.strptime(str_date, '%Y-%m-%d %H:%M:%S')
print(date)  # 2020-02-29 10:40:26
datetime1 = datetime.datetime(2020, 2, 29, 10, 40, 26)
print(datetime1)  # 2020-02-29 10:40:26

11.2.2 date类

  • date类表示日期信息,

date类的常用方法如下。

  • date.today():返回当前的本地日期。
  • date.fromtimestamp(timestamp):返回与UNIX时间戳对应的本地日期。#  fromtimestamp 该函数的转化是根据本地的时区来的,一定要做的就是指定时区。

11.2.3 time类

time类表示一天中的时间信息,time.sleep(5)      # 暂停多少秒

datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

11.2.4 计算时间跨度类——timedelta

datetime.timedelta(days=0, seconds=0, microseconds=0,  minutes=0, hours=0, weeks=0)

  • 其中的所有参数都可以为整数或浮点数,也可以为正数或负数,如右表所示。
  • year 年、 month 月、day 天   、second 秒、micrsecond 微秒 、miliseconds 毫秒 、 minute 分钟、 hour 小时、 weeks 周

11.2.5 将日期时间与字符串相互转换

我们经常会遇到将日期时间与字符串相互转换的情况。

  • 1 将日期时间对象转换为字符串时,称之为日期时间格式化。在Python中使用strftime()方法进行日期时间的格式化,在datetime、date和time三个类中都有一个实例方法strftime(format)。
  • 2 将字符串转换为日期时间对象的过程,叫作日期时间解析。在Python中使用datetime.strptime(date_string,format)类方法进行日期时间解析。
  • %m 两位月份、%y 两位年份、%Y四位年份、%d 两位天数、%H两小时表示(24h)、%I两位小时表示(12h)、%M两位分钟表示、%S两位秒表示、%f两位秒。
  • 在strftime()和strptime()方法中都有一个格式化参数format,用来控制日期时间的格式,常用的日期和时间格式控制符如下表所示。

11.3 正则表达式模块——re

11.3.1 字符串匹配

  • 字符串匹配指验证一个字符串是否符合指定的“字符串模板”,常用于用户输入验证。
  • 例如,用户在注册时要输入邮箱,所以需要验证邮箱是否有效,这就要用到字符串匹配验证。我们使用match(p,text)函数进行字符串匹配,其中的参数p是正则表达式,即字符串模板,text是要验证的字符串。如果匹配成功,则返回一个Match对象(匹配对象),否则返回None。

11.3.2 字符串查找

字符串查找指从一个字符串中查找匹配正则表达式的子字符串,常用于数据分析、网络爬虫等数据处理中,常用的字符串查找函数如下:

  • match函数:尝试从字符串的起始位置匹配一个模式,匹配成功则返回的是一个匹配对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的是空。
  • search(p,text):在text字符串中查找匹配的内容,如果找到,则返回第1个匹配的Match对象,否则返回None。p是正则表达式。
  • findall(p,text):在text字符串中查找所有匹配的内容,如果找到,则返回所有匹配的字符串列表;如果一个都没有匹配,则返回None。p是正则表达式。

查找一个匹配项:

  • 查找并返回一个匹配项的函数有3个:search、match、fullmatch,他们的区别分别是:
  • search: 查找任意位置的匹配项
  • match: 必须从字符串开头匹配
  • fullmatch: 整个字符串与正则完全匹配
  • 举例:result = re.match('^[a-z_][a-z\d_]{5,15}$', s)   #  s = 'sdfdslfopg'

查找多个匹配项:

  • 查找多项函数主要有:findall函数 与 finditer函数:
  • findall: 从字符串任意位置查找,返回一个列表.
  • finditer:从字符串任意位置查找,返回一个迭代器.

11.3.3 字符串替换

正则表达式的字符串替换函数是subn(),该函数替换匹配的子字符串,返回值是替换之后的字符串,其语法格式如下:

  • sub(parrern,repl,string,count = 0)  
  • 其中,参数pattern是正则表达式;参数repl是用于替换的新字符串;参数string是即将被替换的旧字符串;参数count是要替换的最大数量,默认值为零,表示不限制替换数量。
k = 'sfsadfgsdfsaf'
s, k = re.subn('d','s', k, count=0)
s   # 'sfsasfgssfsaf'

k = 'sfsdfgsdfsaf'
s = re.sub('sd', '444', k, count=0)
s  # 'sf444fg444fsaf'

11.3.4 字符串分割

在Python中使用re模块中的split()函数进行字符串分割,该函数按照匹配的子字符串进行字符串分割,返回字符串列表对象,其语法格式如下:

  • re.split(pattrn,string,maxsplit=0)

第12章 文件读写(io操作)

  • 验证是否存在文档的函数:student_txt = open(filename,'w',encoding='utf-8')
  • 文档存储只能存储 'str' 文件
  • 写入文本公式:tudent_txt.write(str(item)+'\n')
  • endswith 以什么结尾,用于判断。     #   if item endswith('.py'):

12.1 打开文件

我们在使用文件之前要先将文件打开,这通过open()函数实现。open()函数的语法如下: open(file,mode = 'r', encoding = None, errors = None)

open()函数中的参数还有很多,这里介绍4个常用参数:

先判断是否存在文件:  # student_txt = open(filename,'w',encoding='utf-8')

1.file参数:

  • file参数用于表示要打开的文件,可以是字符串或整数。如果file是字符串,则表示文件名,文件名既可以是当前目录的相对路径,也可以是绝对路径;如果file是整数,则表示一个已经打开的文件。

2.mode参数:

mode参数用于设置文件打开模式,用字符串表示,例如rb表示以只读模式打开二进制文件。用于设置文件打开模式的字符串中的每一个字符都表示不同的含义,对这些字符的具体说明如下。

  • t:以文本文件模式打开文件。
  • b:以二进制文件模式打开文件。
  • r:以只读模式打开文件。.
  • w:以只写模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则覆盖文件的内容。
  • x:以独占创建模式打开文件,如果文件不存在,则创建并以写入模式打开;如果文件已存在,则引发FileExistsError异常。
  • a:以追加模式打开文件,不能读内容。如果文件不存在,则创建文件;如果文件存在,则在文件末尾追加。
  • +:以更新(读写)模式打开文件,必须与r、w或a组合使用,才能设置文件为读写模式。            # 不能单独使用

3.encoding参数

encoding用来指定打开文件时的文件编码,默认是UTF-8编码,主要用于打开文本文件。

4.errors参数

errors参数用来指定在文本文件发生编码错误时如何处理。推荐errors参数的取值为'ignore',表示在遇到编码错误时忽略该错误,程序会继续执行,不会退出。

12.2 关闭文件

在打开文件后,如果不再使用该文件,则应该将其关闭,会用到close()方法。    # file.close()

12.2.1 在finally代码块中关闭文件

对文件的操作往往会抛出异常,为了保证对文件的操作无论是正常结束还异常结束,都能够关闭文件,我们应该将对close()方法的调用放在异常处理的finally代码块中。

12.2.2 在with as代码块中关闭文件

with as提供了一个代码块,在as后面声明一个资源变量,在with as代码块结束之后自动释放资源。

12.3 读写文本文件

读写文本文件的相关方法如下。

  • read(size=-1):从文件中读取字符串,size限制读取的字符数,size=-1指对读取的字符数没有限制。
  • readline(size=-1):在读取到换行符或文件尾时返回单行字符串。如果已经到文件尾,则返回一个空字符串。size是限制读取的字符数,size=-1表示没有限制。
  • readlines():读取文件数据到一个字符串列表中,每一行数据都是列表的一个元素。
  • write(s):将字符串s写入文件中,并返回写入的字符数。
  • writelines(lines):向文件中写入一个字符串列表。不添加行分隔符,因此通常为每一行末尾都提供行分隔符。
  • flush( ):刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中。

12.4 读写二进制文件

二进制文件的读写单位是字节,不需要考虑编码问题,二进制文件的主要读写方法如下:

  • read(size=-1):从文件中读取字节,size限制读取的字节数,如果size=-1,则读取全部字节。
  • readline(size=-1):从文件中读取并返回一行。size是限制读取的行数,如果size=-1,则没有限制。
  • readlines():读取文件数据到一个字节列表中,每一行数据都是列表的一个元素。
  • writelines(lines):向文件中写入一个字节列表。不添加行分隔符,因此通常为每一行末尾都提供行分隔符。
  • flush():刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中。

seek()方法语法如下:

  • 用于移动文件的读取指针到指定位置
  • fileObject.seek(offset[,whence])
  • 参数: offset --偏移量,也就是代表需要移动偏移的字节数
  • whence:可选,默认值为 0。表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

12.5 目录操作

12.6.1 os 模块

os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。

os模块与os.path模块用于对目录或文件进行操作。

打开内部文件:     举例:os.startfile('F:\\软件\\bilibili\\哔哩哔哩.exe' )        # 其中\\需要各增加一个,语句结尾追加‘\\ '.exe’,        # 或者前面加上r'F:\软件\bilibili\哔哩哔哩.exe'

  • getcwd()        # 返回当前的工作目录
  • listdir(path)            # 返回指定路径下的文件和目录信息
  • mkdir(path[, mode])     # 创建目录
  • makedirs(path1/ path2...[, mode])       # 创建多级目录
  • rmdir(path)       # 删除目录
  • removedirs(path1/ path2......)       # 删除多级目录
  • chdir(path)      # 将path设置为当前工作目录
  • 举例:os.chdir('G:\\01-project\\02-图解Python语法\\chap14')              # 设置工作目录

12.6.2 os.path  模块

os.path模块:

  • abspath(path)         # 用于获取文件或目录的绝对路径
  • exists(path)            # 用于判断文件或目录是否存在, 如果存在返回True, 否则返回False.
  • join(path, name)    # 将目录与目录或者文件名拼接起来
  • splitext()                # 分离文件名和扩展名
  • basename(path)    # 从一个目录中提取文件名
  • dirname(path)       # 从一个路径中提取文件路径, 不包括文件名
  • isdir(path)             # 用于判断是否为路径

举例:print(os.path.abspath('01-测试.py'))              # 获取文件或目录的绝对路径

walk 模块:

  • 用于遍历当前目录及该目录下得所有子目录

关于unicode:(统一码   code:代码)

  • 1. encode:编码      decode:解码
  • 2. python内部编码方式为unicode,decode将其他编码方式转换成unicode编码方式,encode将unicode转换成其他编码方式。
  • 3. 因此unicode相当于一个中转:
  • (1)decode->unicode->encode
  • (2)encode->unicode->decode
  • Unicode 当然是一本很厚的字典,记录着世界上所有字符对应的一个数字。具体是怎样的对应关系,又或者说是如何进行划分的,就不是我们考虑的问题了,我们只用知道 Unicode 给所有的字符指定了一个数字用来表示该字符。
  • UTF-8 是一个非常惊艳的编码方式,漂亮的实现了对 ASCII 码的向后兼容,以保证 Unicode 可以被大众接受。
  • #  ASCII 码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,它是现今最通用的单字节编码系统
  • UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,它的最大特点就是可变长。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。编码规则如下:
  • 对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 - 127 号字符,与 ASCII 码完全相同。( ASCII中的0~31为控制字符;32~126为打印字符;127为Delete(删除)命令。)这意味着 ASCII 码那个年代的文档用 UTF-8 编码打开完全没有问题。
  • 对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。          #  “汉”的 Unicode 码点是 0x6c49(110 1100 0100 1001)  +  1110xxxx 10xxxxxx 10xxxxxx  一>   UTF-8 编码为 11100110 10110001 10001001   

10 Bug的常见类型

  • 粗心导致的语法错误 SyntaxError:
  • 1、漏了末尾的冒号,如if语句,循环语句,else子句等。
  • 2、缩进错误,该缩进的没缩进,不该缩进的瞎缩进。             #  tab 键  整体向右缩进,shift+tab   向左缩进
  • 3、把英文符号写成中文符号,比如说:引号,冒号,括号。
  • 4、字符串拼接的时候,把字符串和数字拼在一起。
  • 5、没有定义变量,比如说while的循环条件的变量。
  • 6、“==” 比较运算符和 ”=” 赋值运算符的混用。
  • 知识不熟练导致的错误:
  • 索引越界问题 IndexError 。                # Index 索引、指数
  • append( )方法的使用掌握不熟练。     # append 一次只能添加一个变量,extend 可以添加多个变量
  • 思路不清导致的问题解决方案
  • 使用print()函数
  • 使用 ”#”
  • 被动掉坑:程序代码逻辑没有错,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃:
  • Python提供了异常处理机制,可以在异常出现时即时捕获,然后内部“消化”,让程序继续运行
  • try + except
  • 多个except结构
  • try...except...else结构
  • try...except...else...finally 结构
  • traceback模块                 #  用于打印错误日志进行备案        traceback:回溯
  • 使用traceback模块打印异常信息。